'boolean', 'locked' => 'boolean', 'trained_at' => 'datetime', ]; // Relationships public function entity(): BelongsTo { return $this->belongsTo(Entity::class, 'entity_id'); } public function setByEntity(): BelongsTo { return $this->belongsTo(Entity::class, 'set_by_entity_id'); } // Status helpers public function isAllowed(): bool { return $this->allowed; } public function isDenied(): bool { return ! $this->allowed; } public function isLocked(): bool { return $this->locked; } public function isTrained(): bool { return $this->source === self::SOURCE_TRAINED; } public function isInherited(): bool { return $this->source === self::SOURCE_INHERITED; } public function isExplicit(): bool { return $this->source === self::SOURCE_EXPLICIT; } // Scopes public function scopeForEntity($query, int $entityId) { return $query->where('entity_id', $entityId); } public function scopeForKey($query, string $key) { return $query->where('key', $key); } public function scopeForScope($query, ?string $scope) { return $query->where(function ($q) use ($scope) { $q->whereNull('scope')->orWhere('scope', $scope); }); } public function scopeAllowed($query) { return $query->where('allowed', true); } public function scopeDenied($query) { return $query->where('allowed', false); } public function scopeLocked($query) { return $query->where('locked', true); } public function scopeTrained($query) { return $query->where('source', self::SOURCE_TRAINED); } }