Laravel Rating es uno de esos paquetes que nos permite añadir toda la lógica necesaria para añadir un sistema de valoraciones a nuestros proyectos Laravel.
Lo mejor de Laravel Rating es que podemos decir qué modelos pueden valorar, pero no sólo eso, también podemos decir qué modelos pueden ser valorados. Por ejemplo, queremos que puedan valorar los usuarios (Modelo User), y queremos que los modelos que puedan ser valorados sean los Posts y Proyectos (Modelos Post y Project).
Instalar y configurar Laravel Rating
Aunque existen muchas dependencias para realizar esta tarea, yo me he decantado por una que es realmente sencilla de utilizar y, lo que más me gusta, es que únicamente se centra en esta tarea, lógica para sistemas de valoraciones en Laravel.
composer require rennokki/rating
php artisan vendor:publish --provider="Rennokki\Rating\RatingServiceProvider" --tag="config"
php artisan vendor:publish --provider="Rennokki\Rating\RatingServiceProvider" --tag="migrations"
La lógica de Laravel Rating reside en una tabla con relaciones polimórficas que gestiona el modelo que valora y el modelo valorado, nada más.
Permitir que el modelo User realice valoraciones
Para permitir que los usuarios puedan realizar valoracionesk debemos ajustar el modelo User, ya que es el encargado de gestionar la autenticación en Laravel, por lo menos por defecto.
<?php
namespace App\Models;
// ...
use Rennokki\Rating\Contracts\Rater;
use Rennokki\Rating\Traits\CanRate;
class User extends Authenticatable implements Rater {
// ...
use CanRate;
}Implementando el contrato Rater y utilizando el Trait Rater tenemos suficiente para que nuestros usuarios puedan empezar a valorar, ahora nos falta qué valorar.
Modelo Curso para realizar valoraciones
El modelo que vamos a utilizar para añadir valoraciones va a ser un modelo Curso, es un caso típico, aquí en la plataforma se utiliza este sistema contra este modelo.
php artisan make:model Course -mfPara permitir que los cursos puedan ser valorados, debemos ajustar el modelo Course de la siguiente forma.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Rennokki\Rating\Contracts\Rateable;
use Rennokki\Rating\Traits\CanBeRated;
class Course extends Model implements Rateable {
use HasFactory;
use CanBeRated;
}Fíjate que tanto el contrato como el Trait han cambiado, ahora son Rateable en lugar de Rater y CanBeRated en lugar de CanRate, es un matiz importante.
Migraciones, factorías y seeds
Vamos a crear la lógica necesaria para poder crear valoraciones con nuestro sistema de rating.
2021_11_26_133319_create_courses_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCoursesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('courses', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(\App\Models\User::class)->constrained();
$table->string("title")->unique();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('courses');
}
}CourseFactory.php
<?php
namespace Database\Factories;
use App\Models\Course;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class CourseFactory extends Factory
{
protected $model = Course::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array {
return [
"user_id" => User::all()->random(1)->first()->id,
"title" => $this->faker->realText(40),
];
}
}DatabaseSeeder.php
<?php
namespace Database\Seeders;
use App\Models\Course;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
User::factory(100)->create();
Course::factory(40)->create();
}
}Realizar valoraciones con nuestros usuarios
Finalmente, para que los usuarios puedan realizar valoraciones, sólo debemos aplicar la siguiente lógica donde necesites.
<?php
use App\Models\Course;
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::get('/rate', function () {
// obtenemos un usuario para valorar un curso
$user = User::all()->random(1)->first();
// obtenemos un curso para valorar
$course = Course::first();
// generamos una puntuación del 0 al 5 con decimales
$randomFloat = rand(0, 50) / 10;
// hacemos que el usuario valore el curso
$user->rate($course, $randomFloat);
// obtenemos el average de las valoraciones de este curso
$avg = $course->averageRating(User::class);
});
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción