将原始联合查询转换为雄辩的关系
Posted
技术标签:
【中文标题】将原始联合查询转换为雄辩的关系【英文标题】:Transform Raw Union Query into Eloquent Relationship 【发布时间】:2019-05-06 02:18:54 【问题描述】:我有一个关于 Laravel 关系的问题。
我有一个原始的联合查询,我想翻译成一个雄辩的关系。
首先...我有 4 张桌子:
角色
id|name
权限
id|name|code|description
permission_role
role_id|permission_id
用户
id|...........|role_id
permission_user
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 等...?
【问题讨论】:
看看github.com/spatie/laravel-permission 我正在构建一个完整的 API,所以我正在使用护照范围生成具有权限的令牌(作为范围),我已经完成了所有工作,我只是想改进此代码 【参考方案1】: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() 函数来获取特定列。
【讨论】:
以上是关于将原始联合查询转换为雄辩的关系的主要内容,如果未能解决你的问题,请参考以下文章