【问题标题】:How to implement Self Referencing pivot table relationship with Eloquent如何使用 Eloquent 实现自引用数据透视表关系
【发布时间】:2017-10-31 10:32:30
【问题描述】:

我有这个场景要实现

“成员 - 专辑” 多对多关系是 cmets。会员可以在任何相册上发布 cmets。相册可以包含来自任意数量成员的 cmets。一些 cmets 可以作为对其他 cmets 的回复发布。

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

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

我仍然不知道如何在 Eloquent 中使用自定义中间表模型来实现这个场景。非常感谢任何帮助。

注意:为了简单起见,我从 ERD 中删除了其他元素..

【问题讨论】:

    标签: database orm eloquent lumen erd


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 评论表是数据透视表或中间表 (laravel.com/docs/5.5/eloquent-relationships#many-to-many)。你还没有在这里使用过。
    • 查看您的表格截图,Comment 表格不是数据透视表。与AlbumMember 的关系是1:N,而不是N:N。想想看,一条评论应该属于一个成员,而不是属于多个成员。 想象一下这条评论是否属于你和我。此外,这条评论应该属于一个帖子而不是多个帖子。 想象一下,如果这条评论也存在于另一个帖子/答案中(有点奇怪)。无论如何,你试过我的答案吗?
    • 这里我正在尝试使用数据透视表来实现解决方案。在您的解决方案中,您没有处理“自引用”。
    • Comment::parent 方法是你的朋友。获取自我引用:$comment->parent(如果有的话,将返回另一个 Comment 对象)。
    【解决方案2】:

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

    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 tocmets,您可以在Comment::belongsTo('Albums')->whereNull('replyTo'); 中添加位置

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2020-08-22
    • 2019-01-25
    • 2023-02-05
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多