【问题标题】:Retrieve distant relation through has-many-through for many-to-many relation in Laravel在 Laravel 中通过多对多关系通过 has-many-through 检索远距离关系
【发布时间】:2016-11-03 10:41:27
【问题描述】:

我的应用程序中有以下模型

  • 用户
  • 任务

有以下关系

  • 用户和组具有多对多关系
  • Task 和 Group 是多对多的关系

所以基本上一个用户可以属于多个组,每个组可以有多个任务。

以下是表结构。

用户

  • 身份证
  • 姓名

群组

  • 身份证
  • 姓名

任务

  • 身份证
  • 姓名

group_user

  • 身份证
  • group_id(组表的外键)
  • user_id(用户表的外键)

group_tasks

  • 身份证
  • group_id(组表的外键)
  • task_id(任务表的外键)

现在我要检索用户的所有任务。

我尝试了以下方法,但均无效。

方法 1

  • $user->groups() 为用户提供组列表
  • $group->tasks() 给出了一个组的任务列表

所以我尝试了

$user->groups()->tasks() 但没用。

方法 2

我尝试将 Has Many Through 添加到我的用户模型中

public function tasks()
{
    return $this->hasManyThrough(Task::class, Group::class);
}

但即使这样也没有用。以下是我得到的错误

QueryException in Connection.php line 713:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'groups.user_id' in 'field list' (SQL: select `tasks`.*, `groups`.`user_id` from `tasks` inner join `groups` on `groups`.`id` = `tasks`.`group_id` where `groups`.`user_id` = 1)

我猜这是因为它期待一对多的关系,但我有一个多对多的关系。

那么有没有办法在不获取所有组然后循环遍历它们的情况下检索它?

【问题讨论】:

  • 你可以试试这个User::with('groups.tasks')
  • @z3r0ck 抱歉,不确定我是否理解您的建议。你能再解释一下吗?我有需要检索任务的User 对象。
  • 好的,在这种情况下你可以这样做$user->load('groups.tasks');
  • @z3r0ck 这只会给我一个 User 模型的实例。如何从中访问任务?我刚刚检查过,它没有任何任务属性。
  • 这个很棘手...您不能直接使用 has many through 因为您有两个数据透视表...我想您可以使用 Collections 来做到这一点,但是如果您这样做效率不高有大数据集。尝试在网络上查找“Laravel 有很多透视表”。

标签: php laravel eloquent laravel-5.2


【解决方案1】:
User Model

public function groups()
{
    return $this->belongsToMany('App\Group');
}

Group Model

public function tasks()
{
    return $this->belongsToMany('App\Task');
}

Task Model

public function groups()
{
    return $this->belongsToMany('App\Group');
}

检索用户的所有任务。

$user = User::find(1);

$user->load('groups.tasks');

$tasks = $user->groups->pluck('tasks')->collapse();

【讨论】:

  • 您能否也请发布您最终如何访问任务?你在使用$user->groups()->tasks() 吗?
【解决方案2】:

您还可以在此处查看 HasManyThrough 的扩展:https://github.com/staudenmeir/eloquent-has-many-deep

它可以帮助您检索关系的许多子级别。 在你的情况下,这将是 用户 -> 属于ToMany(组)-> blongsToMany(任务) 只需将您的方法添加到用户模型中,例如:

public function tasks()
    {
        return $this->hasManyDeep(
            'App\Task',['App\Group']
        );
    }

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2014-10-14
    • 2017-08-03
    • 2016-04-18
    • 2015-02-15
    相关资源
    最近更新 更多