我在 Laravel 中创建了简单的权限系统。每个用户可能与任意数量的权限(多对多)相关联,并且这些权限按组(一对多)组织。
例如,有一个名为 customers
的组,其权限包括 create
、read
、update
和删除
。是的,CRUD:)
现在我需要检查用户是否被允许执行某些操作,例如更新客户。我在 User
模型中为此创建了一个方法,其调用方式如下:
$user->can('customer.update')
如您所见,第一部分是组,第二部分是权限。我设法使这个方法与 SQL 连接一起使用,但我想知道是否可以使用 Eloquent 做得更好。
这是我在用户模型中所做的:
public function can($action) {
$chunks = explode('.', $action);
if (count($chunks) !== 2) {
return false;
}
list($group, $permission) = $chunks;
$matches = $this::permissions()
->join('groups', 'groups.id', '=', 'permissions.group_id')
->where('groups.key', $group)
->where('permissions.key', $permission)
->count();
return $matches > 0;
}
正在运行的查询是(对于 ID = 19 的用户):
select count(*) as aggregate
from `permissions`
inner join `permission_user` on `permissions`.`id` = `permission_user`.`permission_id`
inner join `groups` on `groups`.`id` = `permissions`.`group_id`
where `permission_user`.`user_id` = '19'
and `groups`.`key` = 'customers'
and `permissions`.`key` = 'update'
使用纯粹的 Eloquent 我可以做得更好吗?
最佳答案
return $user->permissions()->where('key', $permission)
->whereHas('group', function ($q) use ($group) {
$q->where('key', $group);
})->exists();
关于php - 在 Laravel 中用 Eloquent 替换 joins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973869/