簡體   English   中英

顯示具有多對多關系的父 ID

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM