Laravel Красноречивые отношения, где не в - PullRequest
0 голосов
/ 10 декабря 2018

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

У меня есть таблица местоположений и таблица списков.Многие списки могут принадлежать одному местоположению.

То, что я хотел бы сделать, это получить определенное местоположение, и в результате должны быть включены все связанные списки, за исключением того, которое просматривает пользователь.Я передаю $listing_id для подзапроса для этого, но проблема в том, что $location_other_listings все еще включает этот список (в приведенном ниже примере с $listing_id = 3).

$listing_id = 3;
$location_other_listings = Location::whereHas('listings', function ($query) use($listing_id) {
  $query->where('id', '!=', $listing_id);
})
->where('id', $location_id)
->first();

Обновление:

Я также попробовал обратное (whereDoesntHave и = вместо !=):

$listing_id = 3;
$location_other_listings = Location::whereDoesntHave('listings', function ($query) use($listing_id) {
  $query->where('id', '=', $listing_id);
})
->where('id', $location_id)
->first();

Но это приводит к NULL для всех моих различных списков.Не уверен, почему.

Как указано, первый запрос работает.Так что я могу сделать следующее: когда $location_other_listings пусто, я знаю, что нет других связанных списков.Если он не пустой, я могу удалить список с текущим listing_id из результирующего массива.Это дало бы желаемый результат, однако мне было интересно, смогу ли я получить этот результат одним запросом.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы должны использовать with() метод с ограничением https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads.

$listing_id = 3;
$location_other_listings = Location::with([
        'listings' => function($query) use ($listing_id){
            $query->where('id', '!=', $listing_id);
        }
    ])
    ->where('id', $location_id)
    ->first();

Тогда листинги $ location_other_listings-> не будут содержать текущий листинг с идентификатором 3.

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