#mysql #laravel #eloquent
#mysql #laravel #красноречивый
Вопрос:
У меня есть запрос, переменные которого считываются как строки. Это выглядит следующим образом:
$contracts = DB::table('completed_contracts')
->select(
DB::raw("((count(completed_contracts.id))) as `numOfCompletedContracts`"),
DB::raw("((count(awarded_contracts.id))) as `numOfCompletedLate`")
)
->leftJoin('awarded_contracts', function($q) {
$q
->on('completed_contracts.awarded_contract_id', '=', 'awarded_contracts.id')
->whereDate('awarded_contracts.completion_date','<','completed_contracts.actual_completion_date');
})
->get();
Когда я выполняю Print_r(DB::getQueryLog());
, выводимый запрос выглядит следующим образом:
SELECT
(
(COUNT(completed_contracts.id))
) AS `numOfCompletedContracts`,
((COUNT(awarded_contracts.id))) AS `numOfCompletedLate`
FROM
`completed_contracts`
LEFT JOIN `awarded_contracts` ON `completed_contracts`.`awarded_contract_id` = `awarded_contracts`.`id` AND `awarded_contracts`.`completion_date` < 'completed_contracts.actual_completion_date'.
Как мне убедиться, что completed_contracts.actual_completion_date
не читается как строка в предложении where?
Ответ №1:
Проблема, похоже, в том, что вы whereDate()
неправильно используете, который, согласно документации Laravel, должен использоваться следующим образом:
->whereDate('created_at', '2016-12-31')
То есть вы передаете столбец date в качестве первого параметра и литерал даты в качестве второго параметра. По-видимому, ваш код выполняется, но не так, как вы предполагаете. Я думаю, что ваш вызов whereDate
должен на самом деле быть просто другим условием в ON
предложении. Попробуйте использовать эту версию:
$contracts = DB::table('completed_contracts cc')
->select(DB::raw("COUNT(cc.id) AS numOfCompletedContracts"),
DB::raw("COUNT(ac.id) AS numOfCompletedLate")
)
->leftJoin('awarded_contracts ac', function($q) {
$q->on('cc.awarded_contract_id', '=', 'ac.id')
->on('ac.completion_date', '<', 'cc.actual_completion_date');
})
->get();
Комментарии:
1. Спасибо. Я думал, вы не могли использовать более одного «on» в подзапросах. Мне пришлось сделать что-то вроде «DB:: table(‘завершенные контракты как cc’)» вместо «DB:: table(‘завершенные контракты как cc’)».