我正在使用belongsToMany
和Post
之间的la {{{}}}关系。
我要做的是让所有Tag
获得多个标签。
我尝试过各种有说服力的查询,但我根本无法得到它。
目前,我可以获得Post
和post_id
的数组,如下所示,但必须有一种更简单的方法。
tag_id
这会转储包含任何ID的所有帖子的数组,但我需要获得一个包含所有if (Request::has('tags')) {
$tags = Tag::find(explode(',', Request::get('tags')));
}else{
$tags = null;
}
// Get all posts tagged with the tags
$jobs = \DB::table('post_tag');
foreach ($tags as $tag) {
$posts = $posts->orwhere('tag_id', $tag->id);
}
dd($posts->get());
的{{1}}数组。
提前致谢!
答案 0 :(得分:6)
最好在whereHas()
模型上使用Post
来急切加载标记,并仅获取至少包含其中一个标记的Post
。
$posts = Post::whereHas('tags', function($q) use ($tags)
{
$q->whereIn('id', $tags);
})->get();
此处,$tags
只是一个标记ID的数组。 $posts
将Collection
Post
。要从中获取id的数组,你可以简单地做到这一点......
$ids = $posts->lists('id');
或者不是最初调用get()
,而是使用...->lists('id')
修改 的
如果您只查找包含所有标记的Post
个,则需要将一些其他参数传递给whereHas
函数。
$posts = Post::whereHas('tags', function($q) use ($tags)
{
$q->whereIn('id', $tags);
}, '=', count($tags))->get();
将会发生的事情是,它只会抓取附加了多个标签的帖子,这些帖子等于标签数组中标签的数量。
如果您使用此方法,请确保您的数据透视表已正确管理,因为无法将某个标记多次附加到某个模型。