我有一个关于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等雄辩的关系吗?
答案 0 :(得分:0)
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()函数获取“特定列”。