'date', 'is_published' => 'boolean', ]; protected $appends = [ 'banner_url', 'content_html', ]; public function bannerUrl(): Attribute { return Attribute::get(function () { if (! $this->banner) { return ''; } $path = ltrim($this->banner, '/'); if (str_starts_with($path, 'storage/')) { $path = substr($path, strlen('storage/')); } return \Storage::disk('public')->url($path); }); } public function contentHtml(): Attribute { return Attribute::get(function () { $markdown = $this->getTranslation('content', app()->getLocale()); $environment = new Environment; $environment->addExtension(new CommonMarkCoreExtension); $environment->addExtension(new TableExtension); $environment->addExtension(new AutolinkExtension); $environment->addExtension(new StrikethroughExtension); $environment->addExtension(new TaskListExtension); $converter = new MarkdownConverter($environment); return (string) $converter->convert($markdown); }); } public function scopePublished(Builder $query) { return $query->whereNotNull('published_at')->where('is_published', true); } public function scopeDraft(Builder $query) { return $query->whereNull('published_at'); } public function category(): BelongsTo { return $this->belongsTo(BlogCategory::class, 'blog_category_id'); } public function author(): BelongsTo { return $this->belongsTo(BlogAuthor::class, 'blog_author_id'); } }