让我们考虑一个"公司"和"员工"模型的简单场景。
一家公司有很多员工。现在,当我在拉拉维尔中绘制这种关系时,从以下角度来看,正确的方法是什么?
方法1:
Employee belongsTo() Company
和Company hasMany() Employee
方法2:
Company belongsToMany() Employee
和Employee hasOne() Company
基本上,belongsTo()-hasMany()
和belongsToMany()-hasOne()
有什么区别?
有三种不同的方法,在你的问题中,你把它们混在一起了。我将介绍所有这些。
多对多
在您的示例中,多对多关系意味着一家公司可以有多个员工,一个员工可以为多个公司工作。
因此,当您对关系使用 belongsToMany()
方法时,这意味着您有一个数据透视表。默认情况下,Laravel假设此表以其他两个表命名,例如 company_employee
示例中。然后,Company
模型和Employee
模型都将具有belongsToMany()
关系。
多对一
但是,使用 hasMany()
意味着它是一对多的关系。如果我们再看一个例子,一家公司可能有很多员工,但每个员工只能受雇于一家公司。
在模型中,这意味着Company
在其关系声明中将具有hasMany()
方法,而Employee
将具有belongsTo()
方法。
一对一
最后,hasOne()
意味着这是一种一对一的关系。在您的示例中,这意味着每家公司可能只有一名员工。由于hasOne()
的倒数也是belongsTo()
,在这种情况下,每个员工也可以只受雇于一家公司。
然后,Company
模型将具有hasOne()
关系方法,而Employee
具有belongsTo()
方法。
在实践中,您几乎总是希望构建一个在表示形式上尽可能接近现实的数据库。您使用什么关系取决于您的情况。在示例中,我猜您想要一种多对一方法,在员工表上使用外键,引用公司表上的 id。但最终,这取决于你。希望有帮助。:)