2014-02-23 36 views
1

我有3个模型:UserRoleTool其中每个用户可以有很多角色,每个角色可以有很多工具。Laravel ManyToMany多个

多对多的关系在每种情况下都能很好地工作。我可以访问:

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。我怎样才能做到这一点?

回答

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()); 
} 

现在,你可以把这个给你User模式叫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查询生成器并创建您自己的查询,但我不明白那会更好。

+0

但我l9ke一解决方案在一个访问数据库不是一个foreach解决方案 – CRIMUVI

+0

@CRIMUVI我扩展了我的答案给你。 – totymedli

+0

工作最后的解决方案,谢谢! – CRIMUVI

0

定义在用户hasManyThrough关系::发现(1) - >角色() - >工具

class User extends Eloquent { 
    public function tools() 
    { 
     return $this->hasManyThrough('Tool', 'Role'); 
    } 
} 

然后你就可以访问直截了当:

$user->tools 
+0

这不起作用,您的解决方案不适用于多关系,请列出roles.user_id列不存在。 – CRIMUVI