Php 拉威尔-曼尼多姆多重
我有三个模型:Php 拉威尔-曼尼多姆多重,php,laravel,laravel-4,many-to-many,pivot-table,Php,Laravel,Laravel 4,Many To Many,Pivot Table,我有三个模型:用户,角色,工具,其中每个用户可以有许多角色,每个角色可以有许多工具 在每种情况下,多对多关系都能很好地工作。我可以访问: User::find(1)->roles Tool::find(1)->roles Role::find(1)->tools Role::find(1)->users 我的桌子是: users id name roles id name tools is name role_user id role_id us
用户
,角色
,工具
,其中每个用户可以有许多角色,每个角色可以有许多工具
在每种情况下,多对多关系都能很好地工作。我可以访问:
User::find(1)->roles
Tool::find(1)->roles
Role::find(1)->tools
Role::find(1)->users
我的桌子是:
users
id
name
roles
id
name
tools
is
name
role_user
id
role_id
user_id
role_tool
id
role_id
tool_id
在每种型号中:
//In User Model
public function roles()
{
return $this->belongsToMany('Rol');
}
//In Role Model
public function users()
{
return $this->belongsToMany('User');
}
public function tools()
{
return $this->belongsToMany('Tool');
}
//In Tool Model
public function roles()
{
return $this->belongsToMany('Rol');
}
我需要获得单个用户的所有工具,如:
user::find(1)->roles()->tools
。我该怎么做?获取用户的所有角色,然后在一个循环中获取该角色的所有工具,并将它们合并到存储所有工具的数组中
$tools = array();
foreach(User::find(1)->roles as $role)
$tools = array_merge($tools, $role->tools->toArray());
这将为每个迭代运行一个查询,因此为了获得更好的性能,您应该使用渴望加载
$tools = array();
foreach (User::find(1)->load('roles.tools')->roles as $role) {
$tools = array_merge($tools, $role->tools->toArray());
}
现在,您可以将其放置到用户
模型中名为tools()
的函数中
public function tools()
{
$tools = array();
foreach ($this->load('roles.tools')->roles as $role) {
$tools = array_merge($tools, $role->tools->toArray());
}
return $tools;
}
您可以这样称呼它:User::find(1)->tools()
我不认为这个框架有更好的解决方案。另一种方法是使用Fluent Query Builder创建您自己的查询,但我不认为这会更好。在User::find(1)->roles()->tools中定义hasManyThrough关系
然后您可以直接访问:
$user->tools
但我喜欢一次访问数据库的解决方案,而不是foreachsolution@CRIMUVI我为您扩展了我的答案。这不起作用,您的解决方案不适用于多对多关系,因为列roles.user_id不存在。
$user->tools