设置由两个表(线程、标记)和一个透视表(标记线程)组成,以允许多对多关系:一个线程可以有多个标记,一个标记可以用于多个线程。
表的属性: 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);
你能想出更好的解决办法吗?谢谢您!
1条答案
按热度按时间chhkpiq41#
如果要获取具有中定义的名称之一的标记的线程
$tagsNames
数组: