morphMany(Rating::class, 'rateable'); } 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'); } // Get user's rating object public function userRating() { if (!auth()->check()) return null; return $this->ratings() ->where('user_id', auth()->id()) ->first(); } // Check if user has rated public function getHasUserRatedAttribute() { return !is_null($this->userRating()); } public function getRatingsCountAttribute() { return $this->ratings()->count(); } // Get rating distribution public function getRatingDistributionAttribute() { $distribution = []; for ($i = 1; $i <= 5; $i++) { $distribution[$i] = $this->ratings()->where('stars', $i)->count(); } return $distribution; } }