Laravel多对多过滤器

时间:2015-10-22 16:59:25

标签: laravel search filter many-to-many

在多对多关系中,找到属于一个元素的所有元素是非常明确的。但我无法弄清楚如何过滤多个。让我解释。 我们假设我们有一个标准的Post和Tag模型。他们处于多对多的关系中。要找到帖子的所有标签,我们会这样做:

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

并获取一些标签的所有帖子,我们会做

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

我无法想象的是搜索包含2,3和等标签的所有帖子。例如,如何查找包含标签的所有帖子'它'和智能手机'但不是只有'它的帖子。或者只是智能手机'。

我尝试过哪里但是它会返回并且或者发布过像“'它”这样的帖子。 || '智能手机&#39 ;.我正在寻找的是和他们一样的'它' &安培;&安培; '智能手机'

1 个答案:

答案 0 :(得分:1)

您可能希望使用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功能,因此,如果您只想要只包含您要查找的代码且没有其他代码的帖子,您可以执行以下操作... < / p>

$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