我的应用程序中有以下模型
-
用户
-
组
-
任务
它有以下关系
-
用户和组具有多对多关系
-
任务和组具有多对多关系
因此,基本上用户可以属于多个组,每个组可以有多个任务 .
以下是表结构 .
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 回答
检索用户的所有任务 .
您还可以在此处查看HasManyThrough的扩展名:https://github.com/staudenmeir/eloquent-has-many-deep
它可以帮助您检索关系的许多子级别 . 在您的情况下,它将是User - > belongsToMany(Groups) - > blongsToMany(Tasks)只需将您的方法添加到用户模型,如: