Laravel Query Builder - whereHas с выбором значения запроса

Jishad спросил: 12 мая 2018 в 04:25 в: laravel

Я очень смущен, как работает функция whereHas?

Я хочу проверить столбец внутри whereHas из основного запроса.

ClientSeatController.php

$seats = ClientSeat::where('clientId',$req->clientId)
          ->wherehas('services',function($query) use($req){
            $query->where('clientId',$req->clientId);
          })->get(); 

ClientSeat.php (Relation)

public function services(){
    return $this->hasOne(ClientSeatService::class,'clientSeatId','clientSeatId');
}

toSql ();

select * from `sln_client_seats` where `clientId` = 3 and exists (select * from `sln_client_seat_services` where `sln_client_seats`.`clientSeatId` = `sln_client_seat_services`.`clientSeatId` and `clientId` = 3)

Мне нужен запрос, как показано ниже.

select * from `sln_client_seats` where `clientId` = 3 and exists (select * from `sln_client_seat_services` where `sln_client_seat_services`.`clientSeatId` =`sln_client_seats`.`clientSeatId`  and `clientId` = 3)

Я хочу проверить таблицу clientSeatId of client_seat_services с помощью clientSeatId столбца таблицы client_seats внутри функции whereHas.

Запрос не выполняет корректно ожидаемое.

Пожалуйста, помогите мне.


1 ответ

Claymore ответил: 12 мая 2018 в 07:50

Удалите $query->where('clientSeatId','client_seats.clientSeatId'); из закрытия whereHas. Ваш метод ClientSeat::services() уже определяет эту часть отношения. То, как вы его написали, буквально помещало бы строку "client_seats.clientSeatId" в запрос, а не фактическое значение Id. Таким образом, вы не получите ошибку, и все ваши результаты будут пустыми.

Jonas Staudenmeir ответил: 13 мая 2018 в 10:15
Запрос теперь соответствует запросу из "Мне нужен запрос, как показано ниже". Только стороны переключаются, но это не имеет значения.
Jishad ответил: 12 мая 2018 в 04:23
Когда я удаляю код на основе вашего комментария, я получаю запрос, как в обновленном вопросе. На самом деле это неправильно. Запрос where where существует как ошибочный. sln_client_seats. clientSeatId = sln_client_seat_services. clientSeatId