【发布时间】:2015-03-14 11:05:40
【问题描述】:
我在 Laravel 中创建了简单的权限系统。每个用户可能与任意数量的权限(多对多)相关联,并且这些权限被组织成组(一对多)。
例如,有一个名为customers 的组具有create、read、update 和delete 等权限。是的,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 做得更好吗?
【问题讨论】:
-
用关系替换连接,更灵活。我已经定义了所有关系,但不知道如何在一个查询中使用两个级别。
-
编辑问题并添加关系,然后我会告诉你如何。
-
A 在第一句话中描述了它们。
-
我让你给他们看。无论如何,在答案下方。
标签: php mysql join laravel eloquent