Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔-曼尼多姆多重_Php_Laravel_Laravel 4_Many To Many_Pivot Table - Fatal编程技术网

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