在多对多关系中,找到属于一个元素的所有元素是非常明确的。但我无法弄清楚如何过滤多个。让我解释。 我们假设我们有一个标准的Post和Tag模型。他们处于多对多的关系中。要找到帖子的所有标签,我们会这样做:
Post::find(1)->tags()->get();
并获取一些标签的所有帖子,我们会做
Tag::find(1)->posts()->get();
我无法想象的是搜索包含2,3和等标签的所有帖子。例如,如何查找包含标签的所有帖子'它'和智能手机'但不是只有'它的帖子。或者只是智能手机'。
我尝试过哪里但是它会返回并且或者发布过像“'它”这样的帖子。 || '智能手机&#39 ;.我正在寻找的是和他们一样的'它' &安培;&安培; '智能手机'
答案 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