Здравствуйте, есть фильтр тегов, реализованный на Laravel, со своей задачей он справляется, фильтрует теги и выводит, только те статьи, у которых есть полное совпадение по тегам.
$post->isPublish()
->with('tags')
->when(!empty($tags), function ($query) use ($tags) {
$query->whereHas('tags', function($q) use($tags) {
$q->whereIn('id', explode(',', $tags))
->groupBy('posts.id')
->havingRaw('COUNT(posts.id) = ?', [count(explode(',', $tags))]);
});
})
->orderBy('id', 'DESC')
->paginate(8);
select * from `posts` where `status` = 1
and exists (select * from `tags` inner join `post_tag` on `tags`.`id` = `post_tag`.`tag_id` where `posts`.`id` = `post_tag`.`post_id` and `id` in ('7', '1', '9')
group by `posts`.`id`
having COUNT(posts.id) = 3)
limit 8
offset 0
Заказчик захотел его "прокачать". Цитирую:
ЕСЛИ человек выбрал несколько фильтров – отображаются сначала статьи, соответствующие всем фильтрам, затем для каждого из фильтров отдельно. ЕСЛИ нет статей, отвечающих ВСЕМ выбранным фильтрам – отображаются статьи, соответствующие хотя бы одному фильтру.
Ломал голову, но так и не понял, реально ли такое сделать. если да, то как?