首页 文章

何时在Laravel 5中使用belongsToMany vs hasMany

提问于
浏览
1

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

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

解释是'Phone'模型持有外键'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没有关系......(但是公司可以在没有用户的情况下存在,反之亦然) .

所以从本质上讲,用户所属的公司以及公司所属的东西用户也是正确的,同时我们也可以说用户有很多公司和公司都有很多用户 .

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

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

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

谢谢!

1 回答

  • 1

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

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

    $user->companies
    $company->users
    

    很明显,您希望在连接的另一侧使用关联的模型 .

    编辑:

    要回答 Headers 问题,请将belongsToMany用于多对多关系 . 如果您与belongsTo结合使用单面关系,请使用hasMany .

相关问题