Laravel DB :: необработанное чтение второго параметра в предложении where строки вместо динамического столбца из другой таблицы

#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’)».