gpt4 book ai didi

laravel - 何时在 Laravel 5 中使用 belongsToMany 与 hasMany

转载 作者:行者123 更新时间:2023-12-01 13:43:31 24 4
gpt4 key购买 nike

有很多类似的问题,但我发现接受的答案并不令人满意。据我所知,现有问题中没有明确的答案。

对于 belongsTo() 与 hasOne(),常见的答案似乎是“用户”和“电话”关系。一个用户有一个电话号码,一个电话号码属于用户。这在 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 的成员,反之亦然。但是 Company3 和 User3 没有任何关系...(但是 Company 可以在没有 User 的情况下存在,反之亦然)。

所以从本质上讲,说 User belongsToMany Companies 和 Company belongsToMany Users 是正确的,同时我们也可以说 User hasMany Companies 和 Company hasMany Users。

现在,如果我们想到一个类比,人们可能会想出一个解释,公司有用户,但用户在那里工作,所以他们属于公司。但是,如果所讨论的用户是公司的所有者,那么用户拥有一家公司,而公司属于用户。

因为用户和公司都可以在没有彼此的情况下生活。我们可以说我们必须使用 hasMany 关系吗? (因为之前的 hasOne 意味着 User 可以在没有 Phone 的情况下存在,但 Phone 不能在没有 User 的情况下存在,因为 belongsTo 要求 User 存在?)

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

谢谢!

最佳答案

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

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

$user->companies
$company->users

很明显,您希望在连接的另一端关联模型。

编辑:

要回答标题问题,请对多对多关系使用 belongsToMany。如果您与 belongsTo 有单边关系,请使用 hasMany。

关于laravel - 何时在 Laravel 5 中使用 belongsToMany 与 hasMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com