Laravel DB :: raw чтение второго параметра, в котором предложение вместо строки динамического столбца из другой таблицы - PullRequest
1 голос
/ 24 марта 2019

У меня есть запрос, чьи переменные читаются как строки.Это выглядит так:

$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 Ответ

1 голос
/ 24 марта 2019

Похоже, проблема в том, что вы используете whereDate() неправильно, который, согласно документации Laravel , должен использоваться следующим образом:

->whereDate('created_at', '2016-12-31')

То естьвы передаете столбец даты в качестве параметра first , а дату литерал в качестве параметра second .Видимо, ваш код работает, но не так, как вы намерены.Я думаю, что ваш вызов 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...