[英]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.