【问题标题】:Replacing joins with Eloquent in Laravel在 Laravel 中用 Eloquent 替换连接
【发布时间】:2015-03-14 11:05:40
【问题描述】:

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

例如,有一个名为customers 的组具有createreadupdatedelete 等权限。是的,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


【解决方案1】:
return $user->permissions()->where('key', $permission)
  ->whereHas('group', function ($q) use ($group) {
      $q->where('key', $group);
  })->exists();

【讨论】:

  • 正如我所说,权限和组是一对多的关系。
  • 没关系。将 groups 更改为 group 如果这是关系名称,仅此而已。
猜你喜欢
  • 2019-12-06
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2023-04-03
  • 2018-11-06
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多