为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕姐8265434 2022-08-19 15:25:22
我有以下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'包,我试图在没有任何原始表达的情况下做到这一点。谢谢。
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

你错误地定义了你的关系。注释模型中有 as 数组,但标签需要多对多关系。要实现这一点,你必须定义一个新表:tags_idscomment-tag


comment-tag

    comment_id - unsined big integer

    tag_id - unsigned big integer

然后在模型中修改关系,如下所示:Commenttags


class 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 文档中的多对多关系。


查看完整回答
反对 回复 2022-08-19
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您可以使用

$post = Post::where('id',1)->with(['comments.tags'])->first();

它将加载所有评论以及评论标签

链接搜索中的引用链接 https://laravel.com/docs/6.x/eloquent-relationshipsNested Eager Loading


查看完整回答
反对 回复 2022-08-19
?
长风秋雁

TA贡献1757条经验 获得超7个赞

更新:您必须修复数据库架构


表结构如下所示:


- 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);

//...


查看完整回答
反对 回复 2022-08-19
  • 3 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信