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

时间:2015-07-09 06:04:04

标签: 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');
    }
}

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

两种方法都运行良好。

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

哪种方法最好?

1 个答案:

答案 0 :(得分:10)

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

仅将associate()与ID

一起使用
$emp->employeeTypes()->associate($request->employee_types_id);

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

1。手动设置外键

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

2。将associate()与模型

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

3。使用associate()只使用id

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

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