【问题标题】:Many To Many relationships in Laravel: belongsToMany() vs. hasManyThrough()Laravel 中的多对多关系:belongsToMany() 与 hasManyThrough()
【发布时间】:2014-03-09 01:46:03
【问题描述】:

在 Laravel 中定义多对多关系时,使用 belongsToMany() 或 hasManyThrough() 有什么区别?

示例: User Account Account_User

因此,用户通过 Account_User 表与 Account 具有多对多关系。除了作为定义相关用户和相关账户的数据透视表之外,它还存储了一个Account_User.role 字段,该字段确定给定用户在给定账户中的角色。

使用User belongsToMany() AccountUser hasManyThrough() Account Account_User 会有什么影响?或者这本质上是一样的?

当决定一个方法时,我想我应该使用相同的方法来定义反向关系。

【问题讨论】:

  • 多次通过不适合您的方法。消极地,您将不得不为数据透视表添加一个 Eloquent 模型。正如我在回答中所说,它们是不同的东西,对于你的例子有很多不合适的。认为 Account_user 是帐户和用户表的一部分,而不是第三个表。

标签: orm laravel laravel-4 relationship eloquent


【解决方案1】:

虽然@Arda 的回答绝对正确,但我发现自己需要一些时间来消化它。所以这是我尝试用更简单的术语来表达同样的事情。

hasManyThrough 在您遇到类似于以下情况时很有用:

  • 一家公司有很多办公室,每个办公室都有很多员工在里面工作。换句话说,Company一对多OfficeOffice一对多Employee。如果您想获取为给定公司工作的所有员工,您需要:
// Company Model

public function employees()
{
    return $this->hasManyThrough('App\Employee', 'App\Office');
}

另一方面,belongsToMany 在您与数据透视表之间存在多对多关系时很有用。例如:

  • 一部电影可以有很多类别(喜剧、戏剧等),每个类别可以属于很多电影。换句话说,Film 多对多 Category。如果您想获取给定电影的所有类别,您需要:
// Film Model

public function categories()
{
    return $this->belongsToMany('App\Category', 'pivot_table_name');
}

鉴于所讨论的场景,belongsToMany 是将许多 Users 连接到许多 Accounts 所需的关系。 hasManyThrough 无法申请。

【讨论】:

    【解决方案2】:

    假设您有两个模型,我们分别调用AB

    如果A可能有不止一项B, 并且 如果B 可能有不止一项A (想像博客文章/标签) 你必须使用belongsToMany();

    现在假设您有 3 个模型,ABC

    AB相关,BC相关。但是你需要访问所有与A相关的C(超过B),然后你需要使用hasManyThrough() (想像 countries -> users -> posts ,你需要来自特定 country 的所有 posts)

    hasManyThrough() 并不完全适用于多对多关系,它更像是一条捷径。

    查看文档链接,12 (Laravel 4.2) 或 34 (Laravel 5.x)。

    【讨论】:

    • 我明白了,所以我将问题更新为更具体。我根本不知道这两种方法的优缺点是什么 - 或者根本没有区别。
    • 确实没有优缺点,因为它们都在做不同的事情。 belongsToMany() 通常包含一个数据透视表,hasManyThrough() 只是hasMany 的快捷方式,所以如果你设置hasManyThrough() 关系,你需要做的就是countries->posts
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 2019-03-26
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多