Laravel withRaw работает с get (), но не с count () - PullRequest
0 голосов
/ 26 февраля 2020

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

 $bills = Bill::leftJoin('important_dates', 'important_dates.id', '=', 'bills.important_date_id')
    ->selectRaw("IF(bills.credit_card_id IS NULL AND important_dates.sent_at IS NOT NULL, important_dates.sent_at, bills.date) AS 'constructed_date'")
    ->havingRaw('constructed_date BETWEEN \''.$data_model['date_from'].'\' AND \''.$data_model['date_to'].'\'');

Если я использую $bills->get(), он работает отлично, возвращая то, что должен. Но если я использую $bills->count(), выдается сообщение об ошибке Unknown column 'constructed_date' in 'having clause'. Означает ли это, что у меня не должно быть предложения having при использовании функции ->count()?

Запрос SQL выглядит следующим образом:

select IF(bills.credit_card_id IS NULL AND important_dates.sent_at IS NOT NULL, important_dates.sent_at, bills.date) AS 'constructed_date' 
from bills 
left join important_dates on important_dates.id = bills.recipient_batch_id 
having constructed_date BETWEEN '2018-02-01' AND '2020-02-29' 
order by constructed_date asc

1 Ответ

0 голосов
/ 26 февраля 2020

Поскольку при использовании count(), laravel будет использовать SELECT COUNT(*) для покрытия

select IF(bills.credit_card_id IS NULL AND important_dates.sent_at IS NOT NULL, important_dates.sent_at, bills.date) AS 'constructed_date' 

, после этого mysql не сможет найти constructed_date, поэтому возникает ошибка.

Вы можете использовать whereBetween вместо havingRaw, это может предотвратить SQL -инъекцию:

->whereBetween(DB::raw('IF(bills.credit_card_id IS NULL AND important_dates.sent_at IS NOT NULL, important_dates.sent_at, bills.date)'), array($data_model['date_from'], $data_model['date_to']))

Так что на этот раз вы можете использовать count(), потому что при его изменении select count(*), нет необходимости использовать constructed_date.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...