'integer', 'parent_id' => 'integer', 'depth' => 'integer', 'status' => 'integer', 'extra_json' => 'array', ]; } public function isEnabled(): bool { return (int) $this->status === 1; } public function isRoot(): bool { return $this->parent_id === null || (int) $this->depth === 0; } /** @return BelongsTo */ public function adminSite(): BelongsTo { return $this->belongsTo(AdminSite::class, 'admin_site_id'); } /** @return BelongsTo */ public function parent(): BelongsTo { return $this->belongsTo(self::class, 'parent_id'); } /** @return HasMany */ public function children(): HasMany { return $this->hasMany(self::class, 'parent_id')->orderBy('code'); } public function isDescendantOf(self $ancestor): bool { if ((int) $this->admin_site_id !== (int) $ancestor->admin_site_id) { return false; } $ancestorPath = (string) $ancestor->path; if ($ancestorPath === '') { return false; } return str_starts_with((string) $this->path, $ancestorPath); } public function isSameOrDescendantOf(self $ancestor): bool { return (int) $this->id === (int) $ancestor->id || $this->isDescendantOf($ancestor); } }