繁体   English   中英

在Laravel中通过多对多关系通过has-man-through检索远距离关系

[英]Retrieve distant relation through has-many-through for many-to-many relation in Laravel

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

  • 用户
  • 任务

具有以下关系

  • 用户和组具有多对多关系
  • 任务和组具有多对多关系

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

以下是表结构。

使用者

  • ID
  • 名称

团体

  • ID
  • 名称

任务

  • ID
  • 名称

group_user

  • ID
  • group_id(带有组表的外键)
  • user_id(用户表的外键)

group_tasks

  • ID
  • group_id(带有组表的外键)
  • task_id(带有任务表的外键)

现在,我想为用户检索所有任务。

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

方法1

  • $user->groups()给出$user->groups()列表
  • $group->tasks()给出一个组的任务列表

所以我尝试了

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

方法2

通过将它添加到我的用户模型中来尝试了“ 拥有很多通过

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 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();

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

它可以帮助您检索关系的许多子级别。 在您的情况下,将是User-> belongsToMany(Groups)-> blongsToMany(任务),只需将您的方法添加到用户模型中即可:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM