Associate ratings to any Eloquent model

v0.0.2 2019-10-19 22:37 UTC

This package is auto-updated.

Last update: 2022-05-20 04:28:25 UTC


Latest Version on Packagist Latest Stable Version Build Status codecov Quality Score StyleCI Total Downloads License

Associate ratings to any Eloquent model.

This package is based on rennokki/rating with some improvements:

  • BugFixes
  • Exceptions
  • Sum of ratings
  • More testing


Install this package with Composer:

$ composer require canylmz/laravel-rating

The package will automatically register itself.

If your Laravel installation does not support package discovery, add this line in the providers array in your config/app.php file:


Optional: if you want to change the table name to something else than "ratings", you can publish the config file with:

php artisan vendor:publish --provider="Canylmz\Rating\RatingServiceProvider" --tag="config"

Publish the migration with:

php artisan vendor:publish --provider="Canylmz\Rating\RatingServiceProvider" --tag="migrations"

After the migration has been published you can create the ratings table by running the migration:

php artisan migrate


Prepare models

To allow a model to rate other models, it should use the CanRate trait and implement the Rater contract.

use Canylmz\Rating\CanRate;
use Canylmz\Rating\Contracts\Rater;

class User extends Model implements Rater
    use CanRate;

    // ...

Each model that can be rated, should use the CanBeRated trait and implement the Rateable contract.

use Canylmz\Rating\CanBeRated;
use Canylmz\Rating\Contracts\Rateable;

class Post extends Model implements Rateable
    use CanBeRated;

    // ...

If your model can both rate and be rated, you should use Rate trait and Rating contract.

use Canylmz\Rating\Rate;
use Canylmz\Rating\Contracts\Rating;

class Member extends Model implements Rating
    use Rate;

    // ...

Rate models

To rate other models, simply call rate() method. As a second argument to the rate() method, you can pass the rating score. It can either be string, integer or float.

$user->rate($post, 10);
$post->averageRating(User::class); // 10.0, as float

If you want to make sure a model gets rated only once, add false as the third argument to the rate() method.

$user->rate($post, 10, false);

Check if a model has been rated with the hasRated() method.

$user->rate($post, 10);
$user->hasRated($post); // true

Get the average rating of a model with the averageRating() method. Pass the class name of the raters as the argument. The return value is the average arithmetic value of all ratings as float.

$user->rate($post, 10);
$post->averageRating(User::class); // 10.0, as float

Get the ratings count with the countRatings() method.

$user->rate($post, 10);
$user->rate($post, 10);
$post->countRatings(User::class); // 2, as integer


You can run the tests with:

$ composer test


Please see the CHANGELOG for more information on what has changed recently.


Please see CONTRIBUTING for details.




MIT. Please see the license file for more information.