ZetIndex_Ram
@ZetIndex_Ram

Как организовать такой поисковый запрос groupBy + having Laravel?

У меня есть 3 таблицы

Книги --> id, название книги

Теги --> id, название тега

книга_тег --> id_книги, id_тега

Книга может иметь много тегов и наоборот тег может иметь много книг (многие-ко-многим) связь. Я хочу организовать поиск таким образом, чтобы выдавались книги только те, что указаны в поиске. Например, в поиске я ищу книги с тегами: комедия и боевик. И поисковый запрос мне выдавал только лишь книги с этими тегами. Чтобы не выдавались книги, которые имеют теги: комедия, боевик и еще какие-то теги.

Я пытался организовать это с помощью WhereIn, однако ничего не получилось, так как как раз в поисковый запрос включаются книги, которые кроме тех поисковых тегов имеют еще дополнительные. Например, я ищу книги с тегами: детектив, комедия, а в поисковый ответ включаются еще книги, которые имеют теги: детектив,комедия,триллер,боевик. То есть, включатся книги, которые кроме поисковых еще имеют дополнительные, что мне не нужно. Вот, что я пытался сделать (однако неудачно, так как дополнительные книги включаются)

foreach ($tags as $tag) {
  if ($request->has($tag->tag))
     $filteredTags[] = $tag->id;
}
if ($filteredTags != null) {
  $booksQuery->whereHas('tags', function ($q) use ($filteredTags) {
      $q->whereIn('id',$filteredTags);
  });
}
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@jazzus
попробуй так
$booksQuery->whereHas('tags', function ($q) use ($filteredTags) {
    $q->whereIn('id', $filteredTags);
})
->whereDoesntHave('tags', function ($query) use ($filteredTags) {
    $query->whereNotIn('id', $filteredTags);
})->get();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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