2015-10-06 35 views
1

我有一个Eloquent模型PostbelongsToMany(Tag::class)关系。现在,在我想要返回或获取具有给定标记集的所有帖子的情况下,执行此类查询的最高效的Laravel-esq方法是什么?返回标有特定标签集的所有Laravel雄辩模型

例如;获取标签为bbq的所有帖子,或者所有标签为bbq AND beef的帖子。

我想简单地传递一个标签数组,如果可能的话,它可以是任意数。我已经尝试了以下几种不同的组合并且没有运气,因为我的SQL功夫并不是最棒的。

$posts = Post::whereHas('tags', function ($query) { 
    $query->whereIn('tag_types.name', ['bbq', 'beef']); 
})->get(); 

回答

0

最终找到了解决方案。在这种情况下,它需要知道有问题的标签的ID,这很容易查询。在这种情况下,我存储标签ID的阵列中的所谓$tag_ids,并使用以下雄辩查询(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的帖子的ID的$tag_ids

希望这可以帮助任何面临类似困境的人。