Eloquent Relationships - Получить уникальный список записей через сводную таблицу. (Принадлежит) - PullRequest
0 голосов
/ 23 января 2020

При наличии отношения ownToMany я получаю коллекцию тем в зависимости от количества заданных вопросов в каталоге. Следовательно, этот список содержит много дубликатов. Я не уверен, могу ли я неправильно понять модель отношений или если я должен просто отфильтровать с помощью различных операций или операций с массивами.

Итак, давайте предположим, что у нас есть три таблицы catalog , тем , вопросов . Принимая во внимание, что вопросы принадлежат одному каталогу и одному топи c. Каталоги и Темы поэтому могут иметь много вопросов. Связь между каталогом и темами установлена ​​в таблице вопросов.

Теперь я хочу показать (отдельный список) всех тем , которые принадлежат конкретному c каталогу. - вопросы .

Для уточнения см. Следующее:

| id | created_at          | updated_at          | title            | is_active | pivot_catalogue_id | pivot_topic_id |
|----|---------------------|---------------------|------------------|-----------|--------------------|----------------|
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 1      | 1         | 1                  | 1              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 1      | 1         | 1                  | 1              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 1      | 1         | 1                  | 1              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 1      | 1         | 1                  | 1              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 1      | 1         | 1                  | 1              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 2      | 1         | 1                  | 2              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 2      | 1         | 1                  | 2              |
| 1  | 2020-01-22 11:51:41 | 2020-01-22 11:51:41 | Topic 2      | 1         | 1                  | 2              |

Диаграмма ER ERDiagram

Модель каталога

    /**
     * Get the corresponding questions of a catalogue.
     *
     */
    public function Questions()
    {
        return $this->hasMany(Question::class);
    }

    /**
     * Get the corresponding topics through questions of a catalogue.
     *
     */
    public function Topics(): belongsToMany
    {
        return $this->belongsToMany(Topic::class, Question::class);
    }

Топи c модель

    /**
     * Get the corresponding questions for a topic.
     *
     */
    public function Question()
    {
        return $this->hasMany(Question::class);
    }

Модель вопроса

    /**
     * Get the corresponding catalogue for the question.
     *
     */
    public function catalogue()
    {
        return $this->belongsTo(Catalogue::class);
    }

    /**
     * Get the corresponding topic for the question.
     *
     */
    public function topic()
    {
        return $this->belongsTo(Topic::class);
    }

1 Ответ

0 голосов
/ 24 января 2020

Вы можете определить отношение BelongsToMany из Каталога:

class Catalogue extends Model
{
    public function topics()
    {
        return $this->belongsToMany(Topic::class, 'questions');
    }
}

Но таблица вопросов будет содержать записи с DUPLICATE комбинацией catalogue_id и topic_id, поэтому $ catalogue-> themes возвращает темы DUPLICATE.

Самое простое, что мы можем сделать, - это установить для отношений Отдельный ().

public function topics()
{
    return $this->belongsToMany(Topic::class, 'questions')->distinct();
}

Так, чтобы удалить повторяющиеся темы.

...