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

gsk*_*gsk 6 php laravel eloquent laravel-5 laravel-5.1

我有两张桌子,employeesemployee 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

EmployeeType

class EmployeeType extends Model {
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是保持关系的正确方法.插入时我可以遵循以下两种方法:

1.设置ID

 $emp = new Employee();
 $emp->employee_type_id = $request->type_id;
 $emp->name = $request->name;
 $emp->save();
Run Code Online (Sandbox Code Playgroud)

2.设置关系

$emp->employeeTypes()->associate(EmployeeType::findOrFail($request->employee_types_id));
$emp->name = $request->name;
$emp->save();
Run Code Online (Sandbox Code Playgroud)

这两种方法都运行良好.

这两种插入方式有什么区别?

哪种方法最好?

luk*_*ter 13

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

使用associate()只用ID

$emp->employeeTypes()->associate($request->employee_types_id);
Run Code Online (Sandbox Code Playgroud)

现在让我们看看这些方法的优点和缺点是什么:

1.手动设置外键

  • 亲:这是最简单的方法
  • Contra:您必须明确使用外键列名称

2. associate()与模型一起使用

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

3. associate()仅使用id

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

我个人更喜欢使用associate()(基本上所有的关系方法,即使它们并不总是必要的).如果我已经有模型我通过了,否则我只会使用id.您已经定义了与外键等的关系,因此您也可以使用它.