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

Есть модель 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]);
});


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

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

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

Похожие вопросы