[英]Returning all Laravel eloquent models tagged with a specific set of tags
我有一个belongsToMany(Tag::class)
模型Post
具有一个belongsToMany(Tag::class)
关系。 现在,在我想返回或获得具有给定标签集合的所有帖子的情况下,执行这种查询的最有效的Laravel-esq方法是什么?
例如; 得到有标签的所有帖子bbq
,或有标签的所有帖子bbq
和beef
。
我想简单地传递一组标签,如果可能的话,其中的标签可以是任意数量的。 我尝试了以下方法,并且尝试了多种不同的组合,但运气不好,因为我的SQL功夫并不是最出色的。
$posts = Post::whereHas('tags', function ($query) {
$query->whereIn('tag_types.name', ['bbq', 'beef']);
})->get();
最终找到了解决方案。 在这种情况下,它需要知道相关标签的ID,这很容易查询。 在这种情况下,我将标签ID存储在名为$tag_ids
的数组中,并使用以下tag_types
查询( tag_types
是数据透视表):
$posts = Post::join('tag_types', function ($join) use ($tag_ids) {
$join
->on('posts.id', '=', 'tag_types.post_id')
->whereIn('tag_types.tag_id', $tag_ids);
})
->groupBy('posts.id')
->havingRaw('count(distinct tag_types.tag_id) = ' . count($tag_ids))
->lists('post_id');
现在, $posts
包含所有帖子的ID,这些帖子包含$tag_ids
列出的每个标签ID。
希望这可以帮助面临类似困境的任何人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.