高效的mysql/eloquent查询,可按多个标记过滤帖子

5jvtdoz2  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(304)

设置由两个表(线程、标记)和一个透视表(标记线程)组成,以允许多对多关系:一个线程可以有多个标记,一个标记可以用于多个线程。
表的属性: treads: id, title tags: id, name threads: id, thread_id, tag_id 现在我想过滤线程使用的不是一个而是许多标记。所以我想得到与所有给定标记相关联的所有线程?仅使用一个,我就可以通过laravel eloquent使用以下模型轻松完成:

$filteredThreads = $tag->threads()->get()

我已经设法用两个标签来做了,但我觉得这是一种非常肮脏和低效的方法(特别是考虑到它会遍历整个ID列表来进行比较):

$threadIds = Thread::select('th.id')
        ->from('threads AS th')
        ->join('tag_thread AS tt', 'tt.thread_id', 'th.id')
        ->join('tags AS ta', 'tt.tag_id', 'ta.id')
        ->where('ta.name', $tag)
        ->pluck('id')
        ->toArray();

return $filteredThreads->whereIn('threads.id', $threadIds);

你能想出更好的解决办法吗?谢谢您!

chhkpiq4

chhkpiq41#

如果要获取具有中定义的名称之一的标记的线程 $tagsNames 数组:

$tagsNames = ['popular', 'cool'];
Thread::whereHas('tags', function($q) use($tagsNames) {
    $q->whereIn('name', $tagsNames);
})->get();

相关问题