belongsTo(Image::class); } public function category() { return $this->belongsTo(Category::class); } public function tags() { return $this->belongsToMany(Tag::class, 'media_tag'); } public function notes() { return $this->morphMany(Note::class, 'noteable'); } public function myNote() { return $this->morphOne(Note::class, 'noteable')->where('user_id', auth()->id()); } public function savedBy() { return $this->belongsToMany(User::class, 'saved_media') ->withTimestamps(); } public function getUrlAttribute() { if ($this->file_path) return asset('storage/' . $this->file_path); return $this->external_url; } public function getIsSavedAttribute() { if (!auth()->check()) return false; return $this->savedBy() ->where('user_id', auth()->id()) ->exists(); } public function ratings() { return $this->hasMany(Rating::class); } public function getAverageRatingAttribute() { return round($this->ratings()->avg('stars'), 1); } public function getUserRatingAttribute() { if (!auth()->check()) return null; return $this->ratings() ->where('user_id', auth()->id()) ->value('stars'); } public function comments() { return $this->hasMany(Comment::class); } }