首页 > 解决方案 > 将原始联合查询转换为雄辩的关系

问题描述

我有一个关于 Laravel 关系的问题。

我有一个原始的联合查询,我想翻译成一个雄辩的关系。

首先......我有4张桌子:

角色

id|name

权限

id|name|code|description

权限角色

role_id|permission_id

用户

id|...........|role_id

权限用户

user_id|permission_id

在我的用户模型中,我有这个方法:

/**
 * @TODO: Transform this into a eloquent relationship
 * 
 * @return Collection
 */
public function permissions()
{
    $query = sprintf('
        (
            SELECT permissions.*
            FROM permissions
            INNER JOIN permission_role ON permission_role.permission_id = permissions.id
            WHERE permission_role.role_id = %s
        ) UNION
        (
            SELECT permissions.*
            FROM permissions
            INNER JOIN permission_user ON permission_user.permission_id = permissions.id
            WHERE permission_user.user_id = %s
        )', $this->role_id, $this->id);

    return Permission::hydrate(DB::select($query));
}

关键是,我想通过用户关联的角色获取所有权限,以及与用户关联的分离权限。

我可以将其转换为一些雄辩的关系,如 hasMany、belongsToMany 等...?

标签: phplaravellaravel-5eloquent

解决方案


Laravel 集合中的“合并”功能或许可以帮到你。最大的不同是我提前用 ->get() 关闭了查询,我使用 merge() 而不是 union()

 // In Controller 
 public function GetUsersWithPermission()
 {
      $permissionByRole = User::with('permission_role.permission')->get();
      $permissionByUser = User::with('permission_user.permission')->get();

      $result = $permissionByRole->merge($permissionByUser);
 }


// User Model : get PermissionRole By User 
public function permission_role() {
    return $this->hasOne('App/Model/permission_role', 'role_id', 'role_id'); }

public function permission_user() {
    return $this->hasOne('App/Model/permission_user', 'user_id', 'id'); }



// permission_role Model : get Permissions By Role 
public function permission(){
    return $this->hasMany('App/Model/Permissions', 'id', 'permission_id');    }

// permission_user Model : get Permissions By User 
public function permission(){
    return $this->hasMany('App/Model/Permissions', 'id', 'permission_id');    }

注意:我没有你的数据,所以我无法证明它有效,但它至少适用于我的数据,所以值得你尝试。它返回所有数据,例如:所有用户详细信息和权限,因此您可以使用 select() 函数来获取特定列。


推荐阅读