🌐 Relaciones muchos a muchos en Eloquent

🌐 Relaciones muchos a muchos en Eloquent

En Laravel, una relación muchos a muchos se utiliza cuando múltiples registros de una tabla pueden estar asociados con múltiples registros de otra. Por ejemplo, un estudiante puede estar inscrito en varios cursos, y un curso puede tener muchos estudiantes.

🧩 1️⃣ Creación de las tablas

Para definir una relación muchos a muchos, se necesita una tabla intermedia (también llamada tabla pivote). Veamos un ejemplo práctico con estudiantes y cursos.

php artisan make:model Estudiante -m
php artisan make:model Curso -m
        

En las migraciones generadas, definimos las estructuras:

// database/migrations/xxxx_create_estudiantes_table.php
Schema::create('estudiantes', function (Blueprint $table) {
    $table->id();
    $table->string('nombre');
    $table->string('email')->unique();
    $table->timestamps();
});

// database/migrations/xxxx_create_cursos_table.php
Schema::create('cursos', function (Blueprint $table) {
    $table->id();
    $table->string('titulo');
    $table->string('descripcion')->nullable();
    $table->timestamps();
});
        

Y ahora creamos la tabla pivote:

php artisan make:migration create_curso_estudiante_table --create=curso_estudiante
        

Definimos su contenido:

Schema::create('curso_estudiante', function (Blueprint $table) {
    $table->id();
    $table->foreignId('curso_id')->constrained()->onDelete('cascade');
    $table->foreignId('estudiante_id')->constrained()->onDelete('cascade');
    $table->timestamps();
});
        

🔗 2️⃣ Definir la relación en los modelos

En el modelo Estudiante:

class Estudiante extends Model
{
    public function cursos()
    {
        return $this->belongsToMany(Curso::class);
    }
}
        

Y en el modelo Curso:

class Curso extends Model
{
    public function estudiantes()
    {
        return $this->belongsToMany(Estudiante::class);
    }
}
        

🧠 3️⃣ Insertar y obtener datos

Para asociar un estudiante a un curso, usamos el método attach():

$estudiante = Estudiante::find(1);
$estudiante->cursos()->attach(2); // Inscribir al curso con ID 2
        

Para eliminar una relación:

$estudiante->cursos()->detach(2); // Eliminar la inscripción
        

Y para sincronizar relaciones (elimina las no incluidas):

$estudiante->cursos()->sync([1, 3, 5]); // Asigna solo esos cursos
        

Para acceder a los cursos de un estudiante:

foreach ($estudiante->cursos as $curso) {
    echo $curso->titulo;
}
        

✅ Conclusión

  • 🌐 Las relaciones muchos a muchos usan una tabla pivote para conectar ambas entidades.
  • 🔗 Se definen en los modelos con belongsToMany().
  • 📚 Métodos como attach(), detach() y sync() permiten gestionar las asociaciones fácilmente.
  • 💡 Eloquent simplifica el manejo de relaciones complejas sin escribir SQL manualmente.


Publicar un comentario

0 Comentarios