Расширенное предложение WHERE внутри левого соединения с несколькими условиями не работает с помощью Eloquent - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь сгенерировать следующий SQL-запрос, используя Eloquent ORM

select * from table_1 
left join table_2 on table_2.id = table_1.id 
    and table_2.offline <= ? 
    and (
        table_2.online >= ? or table_2.online= ?
    )

Несмотря на применение другого подхода, предложенного в stackoverflow и других сайтах, чтобы получить скобку () между предложением AND-0R, я не могу получить желаемый результат. Пример Eloquent запроса:

        Capsule::table('table_1')
        ->leftJoin('table_2', function ($join) use ($from, $until) {
            $join->on('table_2.id', '=', 'table_1.id')
                ->where('table_2.offline', '<=', $until)
                ->where(function($q) use ($from) {
                    $q->where('table_2.online', '>=', $from)
                        ->orWhere('table_2.online', '=', '0000-00-00 00:00:00');
                });
        })
        ->toSql();

Это то, что я сейчас получаю из приведенного выше запроса Eloquent как raw sql.

select * from `table_1` 
left join `table_2` 
    on `table_2`.`id` = `table_1`.`id` 
    and `table_2`.`offline` <= ? and   ?

Целое условие Advanched, где изменено на?. Любые предложения приветствуются!

1 Ответ

0 голосов
/ 14 сентября 2018

В Laravel 5 вы должны включить ведение журнала запросов по:

DB::enableQueryLog();

Затем после размещения вашего окончательного утверждения:

DB::table('table_1')
        ->leftJoin('table_2', function ($join) use ($from, $until) {
            $join->on('table_2.id', '=', 'table_1.id')
                ->where('table_2.offline', '<=', $until)
                ->where(function($q) use ($from) {
                    $q->where('table_2.online', '>=', $from)
                        ->orWhere('table_2.online', '=', '0000-00-00 00:00:00');
                });
        })
        ->get();

просто запустите:

dd(DB::getQueryLog());

он вернет SQL и привязки последних выполненных запросов.В Laravel 4 queryLogging включен по умолчанию, поэтому вы можете просто сбросить журнал запросов.

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