2014-02-23 38 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