Laravel ManyToMany Multiple

旧城冷巷雨未停 提交于 2019-12-11 08:23:00

问题


I have 3 models: User, Role, Tool where each user could have many roles, and each role could have many tools.

The many to many relationships work well in each case. I can access:

User::find(1)->roles
Tool::find(1)->roles
Role::find(1)->tools
Role::find(1)->users

My tables are:

users
 id
 name

roles
 id
 name

tools
 is
 name

role_user
 id
 role_id
 user_id

role_tool
 id
 role_id
 tool_id

In each model:

//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');
}

I need to get all the tools of a single user like: User::find(1)->roles()->tools. How can I do that?


回答1:


Get all the roles of the user, then in a loop you get all tools of the role and merge them to an array where you store all tools.

$tools = array();
foreach(User::find(1)->roles as $role)
    $tools = array_merge($tools, $role->tools->toArray());

This runs a query for every iteration, so for better performance you should use eager loading.

$tools = array();
foreach (User::find(1)->load('roles.tools')->roles as $role) {
    $tools = array_merge($tools, $role->tools->toArray());
}

Now you can place this to a function called tools() in your User model.

public function tools()
{
    $tools = array();   
    foreach ($this->load('roles.tools')->roles as $role) {
        $tools = array_merge($tools, $role->tools->toArray());
    }
    return $tools;
}

You can call it like this: User::find(1)->tools().

I don't think that the framework has a better solution. One other method is to use the Fluent Query Builder and create your own query but I don't see how that would be better.




回答2:


Define a hasManyThrough relationship in User::find(1)->roles()->tools

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

Then you can access straight forward:

$user->tools


来源:https://stackoverflow.com/questions/21966465/laravel-manytomany-multiple

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!