繁体   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