9

我有两张桌子,employeesemployee types

employees有以下字段

  • 身份证(PK)
  • employee_type_id (FK)
  • 姓名

employee_type具有以下字段,

  • 身份证(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();

两种方法都运行良好。

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

哪个是最好的方法?

4

1 回答 1

19

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

仅使用associate()id

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

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

1.手动设置外键

  • 优点:这是最简单的方法
  • 相反:您必须显式使用外键列名

2.associate()配合模型使用

  • 优点:关系将自动设置,因此您可以稍后使用模型,而无需先从数据库中获取它
  • 亲:外键列的名字无所谓(只需要在关系声明中定义)
  • 相反:需要一个额外的查询来首先获取相关模型

3.associate()仅使用 id

  • 亲:外键列的名字无所谓(只需要在关系声明中定义)
  • 反之:关联 id 后不会加载关系。访问时将运行查询$emp->employeeTypes

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

于 2015-07-09T08:33:19.360 回答