Много-ко-многим дубликатам

#php #laravel #eloquent

Вопрос:

Я работаю над приложением Laravel, и у меня есть отношения «многие ко многим», как показано ниже:

У меня есть таблица авторов, таблица сочинений и таблица авторского написания. В таблице author_writing есть дополнительное поле под названием role_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' 
        ]);
    }
 

Таким образом, записи дублируются, потому что у автора более одной роли, поэтому, если у автора три роли, то одна и та же запись отображается три раза, и единственное различие-это идентификатор роли в сводке.
Вместо этого мотыга может показать что-то вроде следующего:

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

Таким образом, только одна запись, но идентификатор role_id содержит все роли, которые автор имеет в написании.

Ответ №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/

Комментарии:

1. Спасибо. К сожалению, я получил SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный автор_записи столбца

2. может быть, вы должны назвать его author_writings буквой s? Я не знаю, как именно вы назвали свои таблицы.

3. Нет, не совсем, возвращенные данные верны, но должен быть предпринят дополнительный шаг для удаления дубликатов

4. Обновил свой ответ. Возможно, вы сможете избежать дублирования, если используете selectRaw -> Distinct.

5. Спасибо, но результат совсем другой, и я даже не вижу остальных атрибутов