Estou tentando limitar o acesso a um modelo específico a apenas certos grupos de usuários. No entanto, dentro desses grupos, há certos serviços proibidos. Estou tentando configurar um escopo global que bloqueará os serviços proibidos.
O código que tenho (não está funcionando) é este.
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));
});
}
O motivo pelo qual não funciona é que $this
não está disponível para o escopo global.
Para esclarecer, o modelo aqui é chamado de encounter
. Um Encounter pode ter muitos grupos, e um grupo pode ter muitos usuários. Um grupo também tem muitos tipos de serviços proibidos. Quero selecionar aqueles registros onde o service_type_id
não está na lista de proibições do grupo atual.
Em SQL, eu escreveria isto:
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>)
Mas estou tentando fazer isso do jeito Laravel .