'array', 'metadata' => 'array', 'assignments' => 'array', 'captured_at' => 'datetime', ]; public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } public function backupSet(): BelongsTo { return $this->belongsTo(BackupSet::class); } public function policy(): BelongsTo { return $this->belongsTo(Policy::class); } // Assignment helpers public function getAssignmentCountAttribute(): int { return count($this->assignments ?? []); } public function hasAssignments(): bool { return ! empty($this->assignments); } public function getGroupIdsAttribute(): array { return collect($this->assignments ?? []) ->pluck('target.groupId') ->filter() ->unique() ->values() ->toArray(); } public function getScopeTagIdsAttribute(): array { return $this->metadata['scope_tag_ids'] ?? ['0']; } public function getScopeTagNamesAttribute(): array { return $this->metadata['scope_tag_names'] ?? ['Default']; } public function hasOrphanedAssignments(): bool { return $this->metadata['has_orphaned_assignments'] ?? false; } public function assignmentsFetchFailed(): bool { return $this->metadata['assignments_fetch_failed'] ?? false; } // Scopes public function scopeWithAssignments($query) { return $query->whereNotNull('assignments') ->whereRaw('json_array_length(assignments) > 0'); } }