'array', 'published_at' => 'datetime', ]; } public function pages() { return $this->hasMany(GuidePage::class)->orderBy('sort_order'); } public function trunkPages() { return $this->hasMany(GuidePage::class) ->where('parent_id', -1) ->orderBy('sort_order'); } public function creator() { return $this->belongsTo(User::class, 'created_by'); } public function stations() { return $this->belongsToMany(Station::class); } public function scopePublished($query) { return $query->where('status', 'published'); } public function scopeCategory($query, string $category) { return $query->where('category', $category); } /** * 按用户线站过滤:全局 Guide(无线站关联)+ 用户线站关联的 Guide */ public function scopeAccessibleBy(Builder $query, User $user): Builder { if (!$user->hasStationRestriction()) { return $query; } $stationIds = $user->getAccessibleStationIds(); return $query->where(function (Builder $q) use ($stationIds) { $q->whereDoesntHave('stations') ->orWhereHas('stations', fn ($sq) => $sq->whereIn('stations.id', $stationIds)); }); } public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() ->logOnly(['name', 'description', 'category', 'status']) ->logOnlyDirty() ->setDescriptionForEvent(fn(string $eventName) => "指引已{$eventName}"); } }