在Laravel中保存模型时直接设置ID和设置雄辩关联关系的区别


Difference between setting ID directly and setting eloquent associate relation when saving a model in Laravel?

我有两个表,employeesemployee types

employees有以下字段

  • id (PK)
  • employee_type_id(颗)
  • <
  • 名称/gh>

employee_type有以下字段,

  • id (PK)
  • 标题

我的雄辩模型函数是,

Employee

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

EmployeeType

class EmployeeType extends Model {
}

我不确定这是否是保持关系的正确方式。当插入时,我可以遵循以下两个方法:

1。设置ID

 $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();

两种方法都可以正常工作。

这两种插入类型的区别是什么?

哪个是最好的方法?

在比较这些选项之前,还有第三个选项:

只使用id

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

现在让我们来看看这些方法的优缺点:

1。手动设置外键

    Pro:这是最简单的方法
  • Contra:你必须显式地使用外键列名

2。使用associate()和模型

  • Pro:关系将自动设置,因此您可以稍后使用模型,而无需首先从数据库中获取模型
  • Pro:外键列的名称无关紧要(只需要在关系声明中定义)
  • Contra:需要额外的查询来首先获取相关模型

3。使用id为

associate()
  • Pro:外键列的名称无关紧要(只需要在关系声明中定义)
  • Contra:关联id后关系不会被加载。当您访问$emp->employeeTypes
  • 时,将运行查询。

我个人更喜欢使用associate()(基本上所有的关系方法,即使它们并不总是必要的)。如果我已经有了模型,我就传递它,否则我就使用id。您已经定义了与外键等的关系,因此不妨使用它