dougou5844 2016-07-01 06:15
浏览 247
已采纳

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

I have the following models in my application

  • User
  • Group
  • Task

which have the following relationships

  • User and Group have a many-to-many relationship
  • Task and Group have a many-to-many relationship

So basically a user can belong to more than one group and each group can have more than one task.

Following is the table structure.

users

  • id
  • name

groups

  • id
  • name

tasks

  • id
  • name

group_user

  • id
  • group_id (foreign key with groups table)
  • user_id (foreign key with users table)

group_tasks

  • id
  • group_id (foreign key with groups table)
  • task_id (foreign key with tasks table)

Now I want to retrieve all the tasks for the user.

I tried the following approaches and both didn't work.

Approach 1

  • $user->groups() gives the list of groups for a user
  • $group->tasks() gives the list of tasks for a group

So I tried

$user->groups()->tasks() but it didn't work.

Approach 2

I tried Has Many Through by adding this to my User model

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

but even that didn't work. The following is the error that I am getting

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)

My guess is that this is happening because it is expecting one-to-many relationship, but I have a many-to-many relationship.

So is there a way to retrieve it without getting all groups and then looping through them?

  • 写回答

2条回答 默认 最新

  • dt614037527 2016-07-01 10:53
    关注
    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');
    }
    

    Retrieving all tasks for a user.

    $user = User::find(1);
    
    $user->load('groups.tasks');
    
    $tasks = $user->groups->pluck('tasks')->collapse();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?