【问题标题】:Many-to-Many duplicates多对多重复
【发布时间】:2021-06-04 21:13:29
【问题描述】:

我正在开发一个 Laravel 应用程序,我有如下多对多关系:

我有 authors 表、writings 表和 author_writing 表。 author_writing 表有一个名为 role_id 的额外字段,其中包含作者在该书中的角色 ID,例如共同作者、编辑……等。 我想得到一个作者的所有作品,以及一个作者在书中的所有角色:我目前得到的是:

[
    {
        "id":1,
        "book_name": "xyz",
        .
        .
        .
        "pivot": {
            "writing_id": 4,
            "author_id": 4,
            "role_id": 1
        },
    },
    {
        "id":1,
        "book_name": "xyz",
        .
        .
        .
        "pivot": {
            "writing_id": 4,
            "author_id": 4,
            "role_id": 2
        },
    },
    {
        "id":1,
        "book_name": "xyz",
        .
        .
        .
        "pivot": {
            "writing_id": 4,
            "author_id": 4,
            "role_id": 4
        },
    },
] 

我通过调用得到这个结果:

    public function writings(){
        return $this->belongsToMany(Writing::class, 'author_writing', 'author_id', 'writing_id')
        ->withPivot([
            'role_id' 
        ]);
    }

所以写作条目是重复的,因为作者有不止一个角色,所以如果作者有三个角色,那么相同的写作会显示3次,唯一的区别是pivot中的role_id。 锄头可以显示如下内容:

[
    {
        "id":1,
        "book_name": "xyz",
        .
        .
        .
        "pivot": {
            "writing_id": 4,
            "author_id": 4,
            "role_id": [1,2, 4]
        },
    },
]

所以只有一个条目,但 role_id 包含作者在写作中的所有角色。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    试试这个:

    public function writings(){
       return $this->belongsToMany(Writing::class, 'author_writing', 'author_id', 'writing_id')
        ->withPivot(['role_id'])
        ->selectRaw('DISTINCT Author.*, Author_Writing.*, Writing.*');
    }
    
    

    在此处查看示例:https://laraveldaily.com/pivot-tables-and-many-to-many-relationships/

    【讨论】:

    • 谢谢。不幸的是,我得到了 SQLSTATE[42S22]: Column not found: 1054 Unknown column author_writing
    • 难道你必须将它命名为 author_writings 并带有 s 吗?我不知道你是如何准确命名你的表的。
    • 不,不是,返回的数据是正确的,但必须采取额外的步骤来删除重复项
    • 更新了我的答案。如果你使用 selectRaw -> Distinct,也许你可以避免重复。
    • 谢谢,但是输出的结果完全不同,我什至看不到其余的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多