Ошибка Laravel Query Builder с объединениями и группировкой параметров - PullRequest
0 голосов
/ 11 июня 2018

У меня есть набор запросов, которые я хотел бы преобразовать из необработанного в построитель запросов, но возникают проблемы при использовании группировки параметров:

SQLSTATE [42S22]: Столбец не найден: 1054 Пользователи неизвестных столбцов.trail_ends_at 'в' предложении where '(SQL: выберите' кампании '. * из' внутреннего объединения пользователей 'кампании' в 'пользователи'. 'id' = 'кампании'. 'user_id' внутреннее объединение 'подписки' на 'пользователи'.'id '=' subscription '.' user_id 'где (' users '.' trial_ends_at> = 2018-06-15 00:00:00 или 'users'. 'trail_ends_at' равно null) и 'campaign'. 'active'= 1 и' кампания '.' Style '= ежемесячно и («подписки». «Trial_ends_at»> = 2018-06-15 00:00:00 или «подписки». «Trail_ends_at» равно нулю) и («подписки».'ends_at '> = 2018-06-15 00:00:00 или' subscription '.' termin_at 'имеет значение null))

SQL-запрос, который работает:

DB::select('select c.* 
FROM  users u, subscriptions s, campaigns c
WHERE   c.user_id = u.id
AND s.user_id = u.id
AND (u.trial_ends_at IS NULL OR u.trial_ends_at >= CURDATE() + :leadDays1)
AND c.active > 0
AND c.style = \'monthly\'
AND (s.ends_at IS NULL OR s.ends_at >= CURDATE() + :leadDays2)
AND (s.trial_ends_at IS NULL OR s.trial_ends_at >= CURDATE() + :leadDays3)
AND c.send_on <= CURDATE() + :leadDays4
AND MONTH(c.send_on) = MONTH(CURDATE() + :leadDays5),
AND DAYOFMONTH(c.send_on) = DAYOFMONTH(CURDATE() + :leadDays6)',
     [
       'leadDays1' => $leadDays,
       'leadDays2' => $leadDays,
       'leadDays3' => $leadDays,
       'leadDays4' => $leadDays,
       'leadDays5' => $leadDays,
       'leadDays6' => $leadDays
      ]
 );

Запрос строителя об ошибках:

$checkDate = Carbon::today()->addDays($leadDays);

    return $campaigns = DB::table('users')
    ->join('campaigns', 'users.id', '=', 'campaigns.user_id')
    ->join('subscriptions', 'users.id', '=', 'subscriptions.user_id')
    ->select('campaigns.*')
    ->where(function ($query) use ($checkDate) {
        return $query->where('users.trial_ends_at', '>=', $checkDate)
        ->orWhereNull('users.trail_ends_at');
      })
    ->where('campaign.active', '=', 1)
    ->where( 'campaign.style', '=', $style)
    ->where(function ($query) use ($checkDate) 
        {
        return $query->where('subscriptions.trial_ends_at', '>=', $checkDate)
    ->orWhereNull('subscriptions.trail_ends_at');
       })
    ->where(function ($query) use ($checkDate) {
        return $query->where('subscriptions.ends_at', '>=', $checkDate)
    ->orWhereNull('subscriptions.ends_at');
       });

1 Ответ

0 голосов
/ 11 июня 2018

Проверьте названия столбцов.Я думаю trail_ends_at должно быть trial_ends_at.

...