php - 在 Laravel 中用 Eloquent 替换 joins

标签 php mysql join laravel eloquent

我在 Laravel 中创建了简单的权限系统。每个用户可能与任意数量的权限(多对多)相关联,并且这些权限按组(一对多)组织。

例如,有一个名为 customers 的组,其权限包括 createreadupdate删除。是的,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/

相关文章:

php - LARAVEL 4 解决方案动态 SEO URLs 通缉

php - 如何使用 PHP 和 MySQL 将表值插入单个数组

php - 计算while循环内的总行数

c# - C#中数据表的内部连接

php - 为什么这个 PDO 语句会默默地失败?

mysql - SQL 在表上同时创建多列索引和单列索引

php - Codeigniter 分页显示太多链接

mysql - SQL 不会将查询排队到链接服务器

php - mysql中按慢查询排序

MYSQL LEFT JOIN 在其他表上添加条件