Разница между установкой ID напрямую и установкой красноречивого отношения ассоциирования при сохранении модели в Laravel?

У меня есть две таблицы, employees и employee types .

employees имеют следующие поля

  • id (PK)
  • employee_type_id (FK)
  • имя

и employee_type имеет следующие поля,

  • id (PK)
  • заглавие

Мои красноречивые функции модели,

Employee

  class Employee extends Model { public function employeeTypes() { return $this->belongsTo('App\Model\EmployeeType'); } } 

EmployeeType

 class EmployeeType extends Model { } 

Я не уверен, что это правильный способ сохранить отношения. При вставке я могу выполнить следующие два метода:

Идентификатор набора.

  $emp = new Employee(); $emp->employee_type_id = $request->type_id; $emp->name = $request->name; $emp->save(); 

2.Настройка отношения

 $emp->employeeTypes()->associate(EmployeeType::findOrFail($request->employee_types_id)); $emp->name = $request->name; $emp->save(); - $emp->employeeTypes()->associate(EmployeeType::findOrFail($request->employee_types_id)); $emp->name = $request->name; $emp->save(); 

Оба метода работают нормально.

В чем разница между этими двумя типами вставки?

Какой лучший метод?

Прежде чем сравнивать варианты, есть третий:

Использование associate() только с идентификатором

 $emp->employeeTypes()->associate($request->employee_types_id); 

Теперь давайте посмотрим, какие преимущества и недостатки методов:

1. Установка внешнего ключа вручную

  • Pro: Это самый простой способ
  • Contra: Вы должны явно использовать имя столбца внешнего ключа

2. Используя функцию associate() с моделью

  • Pro: связь будет установлена ​​автоматически, чтобы вы могли использовать модель позже, не выбирая ее из базы данных
  • Pro: Имя столбца внешнего ключа не имеет значения (его нужно только определить в объявлении отношений)
  • Contra: необходим дополнительный запрос, чтобы сначала получить связанную модель

3. Используя associate() только с идентификатором

  • Pro: Имя столбца внешнего ключа не имеет значения (его нужно только определить в объявлении отношений)
  • Contra: связь не будет загружена после сопоставления идентификатора. Запрос будет выполняться при доступе к $emp->employeeTypes

Я лично предпочитаю использовать associate() (в основном все методы отношений, даже если они не всегда необходимы). Если у меня уже есть модель, я передаю это, и в противном случае я просто использую идентификатор. Вы уже определили свои отношения с внешним ключом и т. Д., Чтобы вы могли использовать его.