繁体   English   中英

返回所有带有特定标签集的Laravel雄辩模型

[英]Returning all Laravel eloquent models tagged with a specific set of tags

我有一个belongsToMany(Tag::class)模型Post具有一个belongsToMany(Tag::class)关系。 现在,在我想返回或获得具有给定标签集合的所有帖子的情况下,执行这种查询的最有效的Laravel-esq方法是什么?

例如; 得到有标签的所有帖子bbq ,或有标签的所有帖子bbqbeef

我想简单地传递一组标签,如果可能的话,其中的标签可以是任意数量的。 我尝试了以下方法,并且尝试了多种不同的组合,但运气不好,因为我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM