Конвертировать SQL в Laravel - PullRequest
1 голос
/ 30 июня 2019

Допустим, у меня есть это:

SELECT * FROM drivers where driver_number NOT IN (SELECT driver_number FROM buses) AND station_id = 2 OR driver_number = 'Dr_02'

и отображает эти данные enter image description here

Тогда я хочу получить эти данные как запрос laravel, и вот что я сделал:

$drivers = Driver::whereRaw('driver_number not in (select driver_number from buses) AND station_id = ? ', [$station_id].' OR id = ?', [$bus->Driver_id])
                    ->get();

Но я получаю эту ошибку:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашему Версия сервера MariaDB для правильного синтаксиса для использования рядом с 'driver_number не в (выберите driver_number из автобусов) И station_id =? ' в строке 1 (SQL: выберите * из drivers, где id = 2 номер_драйвера отсутствует в (выберите номер автобуса из автобусов) И идентификатор станции =?)

Я думаю, что, если говорить об этом, есть ошибка, то есть она получает системную ошибку. Поэтому, если кто-нибудь знает лучший способ сделать это, вы можете помочь.

Ответы [ 3 ]

2 голосов
/ 30 июня 2019

С этим сложно справиться в Laravel. Логика в вашем предложении WHERE в основном (A and B) or C, где условие A может быть представлено подзапросом NOT EXISTS в MySQL.

$drivers = DB::table('Driver d')
    ->where(function($query1) {
        return $query1
            ->whereNotExists(function ($query2) {
                $query2->select(DB::raw(1))
                    ->from('buses b')
                    ->whereRaw('d.driver_number = b.driver_number');
              })
            ->where('station_id', '=', '2');
    })
    ->orWhere('driver_number', '=', 'Dr_02');
->get();
0 голосов
/ 02 июля 2019

Попробуйте,

$result = DB::table('drivers')
->whereNotIn('driver_number', function($q){
    $q->select('driver_number')->from('buses');
})
->where('station_id', '=', 2)
->where('driver_number', '=', 'Dr_02')
->get();
0 голосов
/ 30 июня 2019

Вы можете попробовать использовать

$task_without_due_date = \DB::select(\DB::raw("SELECT * FROM drivers where driver_number NOT IN (SELECT driver_number FROM buses) AND station_id = '.$station_id.' OR driver_number = '.$bus->Driver_id.'"));
...