Связь между двумя моделями с промежуточной таблицей - PullRequest
4 голосов
/ 02 июля 2019

потратили часы на попытки и неудачи, читая документацию и пытаясь перевести документацию на проблему, с которой я сталкиваюсь в Laravel.

Хуже всего то, что проблема не так сложначтобы решить, но почему-то моя голова не будет работать должным образом.

Приложение Laravel, с которым я работаю, это менеджер Тур-де-Франс.У меня есть модели Rider и Stage, и у меня есть промежуточная модель RiderStageStatus, где я буду хранить информацию о том, присоединяется ли гонщик к сцене.Я также хочу реализовать результаты этапа, поэтому я думаю, что проблема снова возникнет для этого позже.

Однако моя база данных выглядит так:

riders
- id
- name
- ...

stages
- id
- departure
- arrival
- ...

statuses
- id
- name
- ...

rider_stage_statuses
- id
- rider_id
- stage_id
- status_id

Так что я должен бытьв состоянии получить гонщиков и их статус для определенного этапа Stage::find(1)->riders, а также получить статусы для каждого этапа гонщика Rider::find(1)->stages.

Но я не могу установить правильные отношения в моделях.Что я делаю не так?

1 Ответ

3 голосов
/ 02 июля 2019

Решение 1

В документации показано, что вы можете добавить дополнительный аргумент, чтобы сообщить Laravel, какую таблицу использовать в качестве сводной таблицы.

Создайте свои классы следующим образом:

Класс райдера

class Rider {

    public function stages() {
        return $this->belongsToMany(Stage::class, 'rider_stage_statuses');
    }
}

Стадия класса

class Stage {

    public function riders() {
        return $this->belongsToMany(Rider::class, 'rider_stage_statuses');
    }
}

Решение 2

Мы также можем исправить ваш код, исправив промежуточную таблицу .

Когда ваш код должен структурироваться следующим образом:

Класс райдера

class Rider {

    public function stages() {
        return $this->belongsToMany(Stage::class)->using(RiderStageStatus::class);
    }
}

Стадия класса

class Stage {

    public function riders() {
        return $this->belongsToMany(Rider::class)->using(RiderStageStatus::class);
    }
}
...