猿问

Laravel 雄辩 - 热切加载嵌套关系

我有以下3个表格:

  • 职位

  • 评论

  • 标签

职位:

 class Post extends Eloquent

    {


        public function comments()

        {

            return $this->hasMany(Comment::class,'post_id','id');

        }


    }


    ** Post data **

    {

       'id' : 1,

       'title' : 'bla bla',

       'created_at: 'some date'

    }


评论:


    class Comment extends Eloquent

    {


        public function comments()

        {

            return $this->belongsTo(Post::class,'id');

        }


        public function tags()

        {

            return $this->hasMany(Tag::class,'id','tags_ids');

        }


    }


** Comments data **


    {

      'id' : 322,

      'active' : true

      'post_id' : 1,

      'created_at: 'some date',

      'tags_ids' : [1,2,3]

    }

标签:


    class Tag extends Eloquent

    {


        public function tags()

        {

            return $this->belongsTo(Comment::class,'tags_ids');

        }


    }


    ** Tags data **

    {

      {'id' : 1,

      'description' : 'some description1'

      },

      {'id' : 2,

      'description' : 'some description2'

      },

      {'id' : 3,

      'description' : 'some description3'

      }

    }


帖子表有许多注释,注释表有许多与之关联的标记。


如何使用预先加载将所有这些表组合在一起?


像这样:


$post = Post::where('id',1)->with(['comments' => function($q) {

   $q->with('tags');

}])->first();


但此查询始终在标记关系中返回空响应。


我做错了什么?


所需的结果如下所示:



{

   'id' : 1,

   'title' : 'bla bla',

   'created_at: 'some date',

   'comments':[{

                  'id' : 322,

                  'active' : true

                  'post_id' : 1,

                  'created_at: 'some date',

                  'tags_ids' : [1,2,3],

                  'tags' : [

                            {'id' : 1,'description' : 'some description1'},

                            {'id' : 2,  'description' : 'some description2'},

                            {'id' : 3,'description' : 'some description3'}

                           ],

              }

             ]

}


您可以看到帖子其中包含评论,评论内部也包含标签关系。


附言:我在我的项目中使用'jenssegers/laravel-mongodb'包,我试图在没有任何原始表达的情况下做到这一点。


谢谢。


慕姐8265434
浏览 95回答 3
3回答

狐的传说

你错误地定义了你的关系。注释模型中有 as 数组,但标签需要多对多关系。要实现这一点,你必须定义一个新表:tags_idscomment-tagcomment-tag    comment_id - unsined big integer    tag_id - unsigned big integer然后在模型中修改关系,如下所示:Commenttagsclass Comment extends Model{    /**     * The tags that belong to the comment.     */    public function tags()    {        return $this->belongsToMany('App\Tag');    }}这种关系的反面是:class Tag extends Model{    /**     * The comments that belong to the tag.     */    public function comments()    {        return $this->belongsToMany('App\Comment');    }}然后,对于预先加载嵌套关系,可以使用“dot”语法:$post = Post::with(['comments', 'comments.tags'])->find(1);有关详细信息,请参阅 Laravel 文档中的多对多关系。

蛊毒传说

您可以使用$post = Post::where('id',1)->with(['comments.tags'])->first();它将加载所有评论以及评论标签链接搜索中的引用链接 https://laravel.com/docs/6.x/eloquent-relationshipsNested Eager Loading

长风秋雁

更新:您必须修复数据库架构表结构如下所示:- posts    - id    - title    - ...- comments    - id    - active    - post_id     - created_at- tags    - id    - description    - comment_id     - created_at// App\Post class Post extends Eloquent {    public function comments()    {        return $this->hasMany(Comment::class,'post_id','id');    }}// App\Comment class Comment extends Eloquent {    public function post()    {        return $this->belongsTo(Post::class);    }    public function tags()    {        return $this->hasMany(Tag::class);    }}//App\Tag    class Tag extends Eloquent {    public function comment()    {        return $this->belongsTo(Comment::class);    }}//...$post = Post::with(['comments', 'comments.tags'])->find(1);//...
随时随地看视频慕课网APP
我要回答