我有3个模型:User
,Role
,Tool
每个用户可以拥有多个角色,每个角色都可以拥有多个工具。
在每种情况下,多对多关系都很有效。我可以访问:
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
。我怎么能这样做?
答案 0 :(得分:1)
获取用户的所有角色,然后在循环中获取角色的所有工具,并将它们合并到存储所有工具的数组中。
$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()
模型中名为User
的函数中。
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并创建自己的查询,但我不知道这会更好。
答案 1 :(得分:0)
在User :: find(1) - > roles() - > tools
中定义 hasManyThrough 关系class User extends Eloquent {
public function tools()
{
return $this->hasManyThrough('Tool', 'Role');
}
}
然后你可以直接访问:
$user->tools