什么时候在Laravel 5

时间:2016-06-14 18:12:59

标签: laravel orm eloquent has-and-belongs-to-many

有很多类似的问题,但我发现接受的答案不能令人满意。就现有问题而言,我没有明确的答案。

对于belongsTo()vs hasOne(),常见的答案似乎是' user'和'电话'关系。用户有一个电话号码,电话号码属于用户。 Laravel文档中也详细解释了这一点: https://laravel.com/docs/5.2/eloquent-relationships

解释是'电话' model持有外键' user_id'。因此,如果没有“用户”,则无法存在电话号码。模型但用户可以在没有电话的情况下存在。如果删除了用户模型,则应删除相关的电话模型。到目前为止一切都很好......

但是,当您有多对多使用数据透视表的关系时,它会变得复杂。 (外键参数不再适用,因为它存在于数据透视表中。)

假设我们有模特公司和用户。公司可以有很多用户,用户可以有很多公司。然后我们有一个名为company_user的数据透视表,它包含company_id和user_id行。

假设用户可以属于许多不同的公司,公司可以属于这些集合相交的许多用户。

让我们说:

Companies:
Company1
Company2
Company3

Users:
User1
User2
User3

Pivot:
User1, Company1
User1, Company2
User2, Company1
User2, Company2

此处,User1和User2都是Company1和Company2的成员,反之亦然。但是Company3和User3没有任何关系......(但是公司可以在没有用户的情况下存在,反之亦然)。

所以从本质上讲,说UserToMany公司和公司所属的ToMany用户是正确的,同时我们也可以说User已经有很多公司和公司有很多用户。

现在,如果我们想到一个类比,可以提出一个解释,公司有用户但用户在那里工作,所以他们属于公司。但是,如果有问题的用户是公司的所有者,那么如果公司属于用户,则用户有公司。

由于用户和公司都可以互相生活。我们可以说我们必须使用hasMany关系吗? (因为早期的hasOne意味着用户可以在没有电话的情况下存在,但是如果没有用户,电话就不能存在,因为belongsTo要求用户存在?)

在此示例中,映射公司 - 用户关系的正确方法是什么?为什么?或者使用哪一个会有什么不同?

谢谢!

1 个答案:

答案 0 :(得分:2)

你陷入了语义杂草。将Laravel排除在等式之外一秒钟,您的原始数据库结构是正确的。通过中间连接表,您有多对多的关系。连接表的存在意味着用户和公司之间可能存在某种形式的关系,但它并不意味着它意味着什么或它需要存在什么。对于您所雇用的用户与拥有公司的示例,您应该在连接表上添加一个属性,例如' role'可能是'所有者','员工','董事会成员'等等。然后当您访问特定公司和用户之间的关系时,您知道这种关系意味着什么。

将Laravel添加回等式,我相信通过Eloquent合并的建议方法是使用belongsToMany方法。但请记住,这只是ORM用来定义这种多对多关系的快捷方式。使用实际查询构建器功能时:

$user->companies
$company->users

很明显,您希望关联模型位于连接的另一侧。

编辑:

要回答标题问题,请使用belongsToMany进行多对多关系。如果您与belongsTo结合使用单面关系,请使用hasMany。