【问题标题】:Laravel ManyToMany MultipleLaravel 多对多
【发布时间】:2014-02-23 09:29:46
【问题描述】:

我有 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。我该怎么做?

【问题讨论】:

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


    【解决方案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 Query Builder 并创建您自己的查询,但我不知道这样会更好。

    【讨论】:

    • 但是我在一次访问数据库中找到了一个解决方案,而不是 foreach 解决方案
    • @CRIMUVI 我为你扩展了我的答案。
    【解决方案2】:

    在 User::find(1)->roles()->tools 中定义 hasManyThrough 关系

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

    然后你就可以直接访问了:

    $user->tools
    

    【讨论】:

    • 这行不通,你的解决方案不适用于多对多关系,给我列 roles.user_id 不存在。
    猜你喜欢
    • 2016-09-03
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2017-09-30
    • 2016-08-27
    相关资源
    最近更新 更多