@Kraky

Более двух внешних ключей в связующей таблице?

Здравствуйте! У меня есть несколько моделей в приложении: работы (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. Ваше решение ?

Спасибо.
  • Вопрос задан
  • 210 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы