2015-10-22 145 views
0

在多对多关系中,找到属于这一个元素的所有元素是相当直截了当的。但我无法弄清楚如何过滤多个。让我解释。 假设我们有一个标准的Post和Tag模型。他们有很多很多的关系。为了找到一个职位的所有标签,我们会做:Laravel多对多过滤器

Post::find(1)->tags()->get(); 

,并得到所有职位的一些标签,我们会做

Tag::find(1)->posts()->get(); 

我找不出什么是搜了整整含2,3的所有帖子等标签。例如,如何找到标签为'it'和'smartphone'的所有帖子,而不是只有“it”或仅“智能手机”的帖子。

我试过whereHas,但它会返回和OR'ed帖子像'it'|| '手机'。我在找的是AND'ing like'it'& &'智能手机'。

回答

0

你会想要使用has()方法。

例如,要找到一个帖子里面只有2个标记以及急于负荷的标签,请执行下列操作...

Post::with('tags')->has('tags', '=', 2)->get() 

http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Builder.html#method_has

如果你需要找到的所有标签一定后有一定的名字,你会使用whereHas()

例如,如果你需要它有“它”和“智能手机”的标签后,就可以执行下列操作...

$tags = ['it', 'smartphone']; 

Post::with('tags')->whereHas('tags', function($q) use ($tags) { 
    $q->whereIn('name', $tags); 
})->get(); 

您也可以通过额外的参数给whereHas功能,所以如果你想只对只有你正在寻找的标签并没有额外标签的帖子,你会做以下...

$tags = ['it', 'smartphone']; 

Post::with('tags')->whereHas('tags', function($q) use ($tags) { 
    $q->whereIn('name', $tags); 
}, '=', count($tags))->get(); 

这假设你的透视表管理得很好。如果您有默认设置(一个帖子多次使用相同的标签),则这不起作用。我建议在包含2个外键的数据透视表上有一个复合主键。

http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Builder.html#method_whereHas