'boolean', 'sort_order' => 'integer', ]; // ── Relationships ──────────────────────────────────────────── public function parent(): BelongsTo { return $this->belongsTo(ClientCategory::class, 'parent_id'); } public function children(): HasMany { return $this->hasMany(ClientCategory::class, 'parent_id')->orderBy('sort_order'); } public function clients(): HasMany { return $this->hasMany(Client::class, 'category_id'); } // ── Scopes ─────────────────────────────────────────────────── public function scopeRoots($query) { return $query->whereNull('parent_id')->orderBy('sort_order'); } public function scopeTopLevel($query) { return $query->whereNull('parent_id'); } // ── Accessors ──────────────────────────────────────────────── public function getFullNameAttribute(): string { return $this->parent ? $this->parent->name . ' › ' . $this->name : $this->name; } // ── Events ─────────────────────────────────────────────────── protected static function boot(): void { parent::boot(); static::creating(function (ClientCategory $cat): void { if (empty($cat->slug)) { $cat->slug = Str::slug($cat->name); } }); } }