[英]Display parent id with many-to-many relationship
我有一个多对多的关系。 我需要获取所有带有父 ID 的标签。 例如,它可能如下所示:
[
{ article_id: 1, id: 1, name: "tag 1" },
{ article_id: 1, id, 2, name: "tag 2" },
{ article_id: 2, id: 1, name: "tag 1" }
]
看标签 1 是两篇文章的两倍。 可能我可以在循环内制作循环,但它看起来并不专业。 你能告诉我这个问题的最佳解决方案吗?
@Edit:我创建了这段代码:
public function articles(){
$article = [];
$allArticles = Articles::all();
foreach($allArticles as $key => $a){
$obj = new \stdClass();
foreach($a->tags as $t){
$obj->article_id = $a->id;
$obj->name = $t->name;
array_push($article, $obj);
}
}
return json_encode($article);
}
但它不像我想要的那样工作。 它只为一篇文章显示一个标签,而不是全部。 任何想法?
不太了解您通过您提供的代码段尝试实现的目标。 但是,根据您问题的开头行,如果您想检索具有相关文章 ID 的所有标签,那么您可以尝试以下操作
$tags = Tag::with('articles')
->get()
->map(function($tag) {
$tag->articleIds = $tag->articles->pluck('id');
unset($tag->articles);
return $tag;
});
这会给你一个 output 像
[
{ id: 1, name: "tag 1", articleIds: [1,2] },
{ id, 2, name: "tag 2", articleIds: [1] },
]
如果您想要其他方式,即获取带有关联标签的文章
$articles = Article::with('tags:id,name')
->get()
->map(function($article) {
$object = new \StdClass;
$object->article_id = $article->id;
$object->tags = $article->tags;
return $object;
});
这会给你一个 output 像
[
{ article_id: 1, tags: [{id: 1, name: "tag 1" }, {id, 2, name: "tag 2"}] },
{ article_id: 2, tags: [{id: 1, name: "tag 1" }]},
]
另一种方法是做一个连接查询,它将根据否为每篇文章返回多行。 分配的标签
$articles = DB::table('articles as a')
->select(['a.id','a.name','t.name as tag'])
->join('article_tags as at', 'a.id', '=', 'at.article_id')
->join('tags as t', 't.id', '=', 'at.tag_id')
->get();
所以这样你就不需要额外的循环,也不会触发额外的查询( N+1 )来获取相关标签。
动态属性是“延迟加载”,这意味着它们只会在您实际访问它们时加载它们的关系数据。 正因为如此,开发人员经常使用预先加载来预加载他们知道在加载 model 后会访问的关系。 急切加载显着减少了加载模型关系必须执行的 SQL 查询。
如果您仍然想使用循环方法 go ,那么至少使用像这样的急切加载
$allArticles = Articles::with('tags')->all();
但它仍然会触发多个查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.