gpt4 book ai didi

php - Laravel 5 Eloquent hasManyThrough/belongsToManyThrough 关系

转载 作者:搜寻专家 更新时间:2023-10-31 21:04:12 24 4
gpt4 key购买 nike

在 Laravel 5.2 应用程序中,我有三个模型:UserRoleTask。一个 User 与多个 Roles 相关联,一个 Role 与多个 Tasks 相关联。因此,每个用户通过他们的角色关联到多个任务。

我正在尝试通过他们的角色访问与 User 关联的所有 Tasks

我模型的相关部分如下所示:

class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany('App\Role');
}

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

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

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

class Task extends Model
{
public function roles()
{
return $this->belongsToMany('App\Role');
}
}

以下返回SQL错误;

Column not found: 1054 Unknown column 'roles.user_id'

它似乎试图通过角色模型中的(不存在的)外键访问关系,而不是通过数据透视表。

$user = Auth::user;
$tasks = $user->tasks;

如何通过这些关系访问与用户相关的所有任务?

最佳答案

我开发了一个 custom BelongsToManyThrough relationship你可能会感兴趣。您需要添加新的关系类(如我的要点中给出;粘贴到此处太长),并且还需要按照要点中的描述覆盖您的基础 Model 类以实现 belongsToManyThrough

然后(假设您正在使用 Laravel 的默认表命名方案 - 如果没有,您也可以指定连接表),您可以将您的关系定义为:

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

belongsToManyThrough 不仅会为您提供用户的任务列表,还会告诉您每个用户拥有每个任务的角色。例如,如果您有:

$user->tasks()->get()

输出看起来像这样:

 [
{
"id": 2,
"name": "Ban spammers",
"roles_via": [
{
"id": 2,
"slug": "site-admin",
"name": "Site Administrator",
"description": "This role is meant for \"site administrators\", who can basically do anything except create, edit, or delete other administrators."
},
{
"id": 3,
"slug": "group-admin",
"name": "Group Administrator",
"description": "This role is meant for \"group administrators\", who can basically do anything with users in their same group, except other administrators of that group."
}
]
},
{
"id": 13,
"name": "Approve posts",
"roles_via": [
{
"id": 3,
"slug": "group-admin",
"name": "Group Administrator",
"description": "This role is meant for \"group administrators\", who can basically do anything with users in their same group, except other administrators of that group."
}
]
},
{
"id": 16,
"name": "Reboot server",
"roles_via": [
{
"id": 2,
"slug": "site-admin",
"name": "Site Administrator",
"description": "This role is meant for \"site administrators\", who can basically do anything except create, edit, or delete other administrators."
}
]
}
]

与涉及 foreach 的其他解决方案相比,我的自定义关系可以高效地执行此操作,这将创建一个 n+1 query问题。

关于php - Laravel 5 Eloquent hasManyThrough/belongsToManyThrough 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35306242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com