首页 文章

通过Laravel中多对多关系的has-many-through检索远程关系

提问于
浏览
0

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

  • 用户

  • 任务

它有以下关系

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

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

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

以下是表结构 .

users

  • id

  • 名字

groups

  • id

  • 名字

tasks

  • id

  • 名字

group_user

  • id

  • group_id(带组表的外键)

  • user_id(带用户表的外键)

group_tasks

  • id

  • group_id(带组表的外键)

  • task_id(带任务表的外键)

现在我想检索用户的所有任务 .

我尝试了以下方法,两者都没有用 .

Approach 1

  • $user->groups() 给出用户的组列表

  • $group->tasks() 给出了组的任务列表

所以我试过了

$user->groups()->tasks() 但它没有用 .

Approach 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)

我的猜测是,这种情况正在发生,因为它期待一对多的关系,但我有多对多的关系 .

那么有没有办法检索它而不需要获取所有组然后循环它们?

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

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

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

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

相关问题