'array', 'meta_keywords' => 'array', 'sort_order' => 'integer', 'published_at' => 'datetime', ]; protected static function boot() { parent::boot(); static::creating(function (Page $page) { if (empty($page->slug)) { $slug = Str::slug($page->title); if (empty($slug)) { $slug = 'page-'.time(); } $originalSlug = $slug; $count = 1; while (static::withTrashed()->where('slug', $slug)->exists()) { $slug = $originalSlug.'-'.$count++; } $page->slug = $slug; } }); } // ==================== Relationships ==================== public function parent() { return $this->belongsTo(Page::class, 'parent_id'); } public function children() { return $this->hasMany(Page::class, 'parent_id')->orderBy('sort_order'); } public function creator() { return $this->belongsTo(User::class, 'created_by_user_id'); } public function lastUpdatedBy() { return $this->belongsTo(User::class, 'last_updated_by_user_id'); } // ==================== Query Scopes ==================== public function scopePublished(Builder $query): Builder { return $query->where('status', self::STATUS_PUBLISHED); } public function scopeTopLevel(Builder $query): Builder { return $query->whereNull('parent_id'); } // ==================== Helper Methods ==================== public function isDraft(): bool { return $this->status === self::STATUS_DRAFT; } public function isPublished(): bool { return $this->status === self::STATUS_PUBLISHED; } public function publish(?User $user = null): void { $updates = [ 'status' => self::STATUS_PUBLISHED, 'published_at' => $this->published_at ?? now(), ]; if ($user) { $updates['last_updated_by_user_id'] = $user->id; } $this->update($updates); } public function getStatusLabel(): string { return match ($this->status) { self::STATUS_DRAFT => '草稿', self::STATUS_PUBLISHED => '已發布', default => '未知', }; } }