Как выполнить запрос?

Есть модель Person она связана с моделями Genre через отношение многие-ко-многим.
В поисковом запросе мне нужно находить персон, кои имеют все указанные "жанры" юзером.
Я делал это так
$results = $results->whereHas('genres', function ($query) use ($request){
    $query->whereIn('name', array_column($request->genres, 'name'));
});

Но такой вариант возвращает персон, которые имеют хотя бы один из перечисленных "жанров", что не правильно.
Как сделать так ,чтобы проверялось наличие всех "жанров" у персоны.
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ответы на вопрос 1
v_decadence
@v_decadence
$relations_ids = [1, 2, 3];

Place::whereHas('comforts', function ($query) use ($relations_ids) {
    $query->whereIn('id', $relations_ids);
}, '>=', count($relations_ids))->get();


Смысл в том, что количество записей, которые попадают в нужные id, не меньше количества id.
Но это работает только в том случае, если одна связанная запись не может быть привязана несколько раз.

Альтернативно, можно сделать отдельный whereHas для каждого id (естественно через цикл, чтобы код не копипастить).
Place::whereHas('comforts', function ($query) use ($relations_ids) {
    $query->whereIn('id', $relations_ids[0]);
})->whereHas('comforts', function ($query) use ($relations_ids) {
    $query->whereIn('id', $relations_ids[1]);
});


Не знаю, насколько это всё быстро работает, под нагрузками не проверял.

Первый способ, думаю, быстрее второго.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы