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:
Canylmz\Rating\RatingServiceProvider::class,
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
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;
// ...
}
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.