Здравствуйте! У меня есть несколько моделей в приложении: работы (Work), запчасти (Part) и этапы (Step). Для того, чтобы знать на каком этапе и для какой запчасти применяются работы есть таблица
part_step_work
, в ней содержаться только 3 поля, и все 3 поля являются внешними ключами на таблицы тех моделей, что я перечислил выше. Вопрос - как вы поступаете в данной ситуации:
1. Оставляете только внешние ключи и не создаёте автоинкрементное поле
id
. Далее работа происходит только через связь
belongsToMany
с заданием условия wherePivot для третьего поля. Т.е. в каждой модели будет описано поведение для выбора связей. Пример для модели
Part
:
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function works() :\Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(\App\Models\Repair\Work::class, 'part_step_work', 'partId', 'workId')
->withPivot('stepId');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function steps() :\Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(\App\Models\Repair\Step::class, 'part_step_work', 'partId', 'stepId')
->withPivot('workId');
}
public function worksOfStep($step) :\Illuminate\Database\Eloquent\Relations\BelongsToMany
{
$step = ($step instanceof \Illuminate\Database\Eloquent\Model) ? $step->getKey() : $step;
return $this->works()->wherePivot('stepId', $step);
}
Стоит учесть, что при создании новых моделей также придется каждый раз прописывать доп. атрибуты для pivot полей.
2. Создаёте PK и работаете со связью
hasMany
для каждой модели. Пример для
Part
:
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function worksOnSteps() :\Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(\App\Models\Pivot\PartStepWork::class, 'partId');
}
3. Ваше решение ?
Спасибо.