#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 предлагает отношения «многие ко многим», но я предпочитаю, чтобы вы разделили отношения по буксиру. сделайте таблицу для этого отношения с идентификатором грузовика и идентификатором поездок, затем создайте отношение один ко многим между грузовиком и этой новой таблицей и другое отношение один ко многим между поездкой и этой новой таблицей. это будет легко для вас