如何使用Eloquent实现自引用数据透视表关系

时间:2017-10-31 10:32:31

标签: database orm eloquent lumen erd

我要实施此方案

enter image description here

“会员 - 专辑”多对多的关系就是评论。会员可以在任何相册上发表评论。相册可以有任意数量的会员发表评论。可以发布一些评论作为对其他评论的回复。

“reply_to”指的是父评论。也就是说,评论可以有几个回复。

enter image description here

我在我的项目中使用了Eloquent和Lumen 5.5。我已经完成了这两个文档。我知道如何实现M:N,M:1等关系。

我仍然无法使用Eloquent中的自定义中间表模型来了解如何实现此方案。非常感谢任何帮助。

注意:我已从ERD中删除了其他元素以使其变得简单..

2 个答案:

答案 0 :(得分:0)

据我所知。 以下是模型中所需的关系。\

Comments model

Comment::belongsTo('Member'); //add namespace of member model   Comment::belongsTo('Albums'); //add namespace of member model

Member model

Member::hasMany('comments');

Album model   Album::hasMany('comments');

如果没有收到reply to条评论,您可以在Comment::belongsTo('Albums')->whereNull('replyTo');

中添加

然后可以通过评论ID获取回复评论。

答案 1 :(得分:0)

试试这个

class Member
{
    public function comments()
    {
        return $this->hasMany(Comment:class, 'Member_id'); // a member may has many comments
    }
}

class Album
{
    public function comments()
    {
        return $this->hasMany(Comment::class, 'Album_id'); // an album may has many comments
    }
}

class Comment
{
    public function parent()
    {
        return $this->belongsTo(Comment::class, 'reply_to'); // self reference
    }

    public function member()
    {
        return $this->belongsTo(Member::class, 'Member_id'); // a comment should belongs to a member
    }

    public function album()
    {
        return $this->belongsTo(Album::class, 'Album_id'); // a comment should belongs to an album
    }
}

查询:

Album::with(['comments' => function ($query) {
    $query->with(['parent', 'member]);
}])->get();