belongsTo(User::class); } public function video() { return $this->belongsTo(Video::class)->withDefault(); } public function reactions() { return $this->hasMany(PostReaction::class); } public function postImages() { return $this->hasMany(PostImage::class)->orderBy('sort_order'); } public function postVideos() { return $this->hasMany(PostVideo::class)->with('video')->orderBy('sort_order'); } public function isLikedBy(?User $user): bool { if (! $user) return false; return $this->reactions()->where('user_id', $user->id)->exists(); } public function getReactionCountAttribute(): int { return $this->reactions()->count(); } public function getImageUrlAttribute(): ?string { if (! $this->image) return null; if (str_starts_with($this->image, 'users/')) { return route('media.post-image', $this->image); } return asset('storage/post_images/' . $this->image); } }