Laravel多对多

时间:2014-02-23 09:29:46

标签: php laravel laravel-4 many-to-many pivot-table

我有3个模型:UserRoleTool每个用户可以拥有多个角色,每个角色都可以拥有多个工具。

在每种情况下,多对多关系都很有效。我可以访问:

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。我怎么能这样做?

2 个答案:

答案 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