我正在尝试将特定模型的访问权限限制为仅特定用户组。但是,在这些组中,存在某些被禁止的服务。我正在尝试设置一个全局范围来阻止被禁止的服务。
我拥有的代码(不起作用)是这样的。
protected static function boot()
{
parent::boot();
static::addGlobalScope('status', function (Builder $builder) {
$builder->whereHas('groups.users', fn($q) => $q->where('user_id', Auth::user()->id))
->whereDoesntHave('groups.prohibitedServiceTypes', fn($q) => $q->where('service_type_id', $this->service_type_id));
});
}
它不起作用的原因是它$this
不适用于全局范围。
为了澄清一下,这里的模型称为encounter
。一个 Encounter 可以有多个组,一个组可以有多个用户。一个组也有许多禁止的服务类型。我想选择那些不在service_type_id
当前组的禁止列表中的记录。
在 SQL 中我会这样写:
SELECT * FROM encounters e
JOIN group_encounter ge ON (e.id = ge.encounter_id)
JOIN groups g ON (g.id=ge.group_id)
JOIN group_user gu ON (gu.group_id=g.id)
WHERE gu.user_id = <current user> AND NOT EXISTS
(SELECT * FROM group_prohibited_service_types WHERE service_type_id = <current service type>)
但我正在尝试用laravel 方法来做到这一点。
您可以使用 whereColumn 来比较查询中的两列:
但是你应该注意,
Auth::user()
不应该在范围或模型中使用,因为它会为 Http\Controllers 之外的任何上下文返回 null