Как реализовать внешний ключ mutli в laravel 8

#laravel #eloquent

Вопрос:

Я работаю над проектом, в котором требуется реализовать взаимосвязь базы данных между таблицами(Поездка, грузовик, топливо) . Ниже приведена идея :

  • У грузовика много поездок
  • В каждой поездке много грузовиков
  • У каждого грузовика есть топливо, связанное с поездкой.

Теперь я надеялся использовать Красноречивые отношения, чтобы решить эту проблему, но застрял . Как мне получить транзакцию с топливом и сопоставить ее с грузовиком и поездкой ?

Заранее спасибо!

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

1. Короткий ответ-красноречивые отношения: laravel.com/docs/8.x/eloquent-relationships

Ответ №1:

вы можете использовать сводную таблицу.

«сводная таблица используется для построения взаимосвязи между двумя таблицами, в которых существует взаимосвязь»Многие ко многим»».

в вашем случае вы можете использовать соотношение «Много ко многим» между грузовиком и поездкой, а затем использовать топливо как столбец в сводной таблице. так проще

Ответ №2:

Красноречивый не поддерживает троичные отношения из коробки. Это связано с тем, что обычно троичные отношения неправильно используются, когда обычные двоичные отношения были бы более подходящими. Например, я мог бы утверждать, что Fuel сущность на самом деле является метаданными об Truck-Trip отношениях и вместо этого должна быть помещена в сводную таблицу.

Если вы полностью на 100% уверены, что ваши троичные отношения требуются правильно, то я думаю, что вам лучше всего создать отдельную модель TruckTrip , т. е.:

 class TruckTrip extends Model {
    public function truck() {
         return $this->belongsTo(Truck::class);
    }
    public function trip() {
         return $this->belongsTo(Trip::class);
    }
    public function fuel() {
         return $this->belongsTo(Fuel::class);
    }
}
 

Тогда вместо того, чтобы напрямую связывать грузовик, поездку и топливо, вы могли бы использовать: hasManyThrough например

 class Trip extends Model {
    public function trucks() {
         return $this->hasManyThrough(Truck::class, TruckTrip::class);
    }
    public function fuel() {
         return $this->hasManyThrough(Fuel::class, TruckTrip::class);
    }
}
 

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

Ответ №3:

Laravel предлагает отношения «многие ко многим», но я предпочитаю, чтобы вы разделили отношения по буксиру. сделайте таблицу для этого отношения с идентификатором грузовика и идентификатором поездок, затем создайте отношение один ко многим между грузовиком и этой новой таблицей и другое отношение один ко многим между поездкой и этой новой таблицей. это будет легко для вас