'datetime', ]; protected static function booted(): void { static::saving(function (Publication $publication) { if (empty($publication->slug) && !empty($publication->title)) { $publication->slug = Str::slug($publication->title); } }); } public function post(): BelongsTo { return $this->belongsTo(Post::class); } public function channel(): BelongsTo { return $this->belongsTo(Channel::class); } public function prefix(): BelongsTo { return $this->belongsTo(Prefix::class); } public function blocks(): HasMany { return $this->hasMany(Block::class)->orderBy('order'); } public function taxonomyTerms(): BelongsToMany { return $this->belongsToMany(TaxonomyTerm::class); } public function scopePublished(Builder $query): Builder { return $query->where('status', 'published'); } public function scopeForChannel(Builder $query, Channel $channel): Builder { return $query->where('channel_id', $channel->id); } public function scopeForPrefix(Builder $query, Prefix $prefix): Builder { return $query->where('prefix_id', $prefix->id); } public function getUrlAttribute(): string { $this->loadMissing('prefix'); $this->channel->loadMissing('prefixes'); $prefixSlug = $this->prefix?->slug ?? $this->channel->prefixes->first()?->slug ?? 'p'; $identifier = $this->slug ?? $this->post_id; return "/{$prefixSlug}/{$identifier}"; } }