40. Relación muchos a muchos
En una relación muchos a muchos, cada registro en una tabla puede estar relacionado con varios registros en otra tabla y viceversa. Para establecer esta relación se requiere una tabla intermedia, la cual contiene las claves foráneas de ambas tablas relacionadas como claves primarias.
Un ejemplo común de una relación muchos a muchos es una tienda online, donde un producto puede ser comprado por muchos clientes, y a su vez, un cliente puede comprar varios productos. En este caso, se crea una tabla intermedia de pedidos que contiene las claves foráneas de las tablas de clientes y productos, y se relaciona cada compra con el cliente y el producto correspondiente. La relación muchos a muchos es una de las relaciones más utilizadas en las bases de datos y es una forma efectiva de modelar relaciones complejas entre entidades.
2 comentarios
Inicia sesión para comentar
Comentarios:
-
Walter hace 2 años
? Relaciones muchos a muchos
Encontramos relaciones de este tipo por ejemplo entre las tablas users y roles.
Para representar esta relación debemos crear una tabla intermedia que, como vimos, se llamará role_user y contendrá los campos user_id y role_id con sus respectivas restricciones de llave foránea.
Como role_user es una entidad débil primero debemos crear la tabla roles:
php artisan make:model Role -m
Agregamos el campo que necesitamos almacenar en la migración:
$table->string('name', 45);
Ahora si podemos crear la tabla role_user:
php artisan make:migration create_role_user_table
Agregamos al método up de la migración los campos que necesitamos guardar con sus restricciones de llave foránea:
$table->unsignedBigInteger('role_id'); $table->unsignedBigInteger('user_id'); $table->foreign('role_id') ->references('id')->on('roles') ->onDelete('cascade'); $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');
Realizamos las migraciones correspondientes:
php artisan migrate
Ya hicimos las relaciones a nivel base de datos, ahora hagamos las relaciones a nivel modelos.
Relación muchos a muchos en el modelo User:
public function roles() { return $this->belongsToMany('App\Models\Role'); }
Relación muchos a muchos en el modelo Role:
public function users() { return $this->belongsToMany('App\Models\User'); }
? Métodos para agregar registros a la tabla intermedia
Lo haremos desde Tinker:
php artisan tinker >>> use App\Models\User; >>> $user = User::find(1); >>> $user->roles()->attach(1); >>> $user->roles()->attach(2); >>> $user->roles()->detach(1); >>> $user->roles()->detach(2); >>> $user->roles()->attach([1, 2, 3]); >>> $user->roles()->detach([1, 2]); >>> $user->roles()->sync([1, 2]);
El método attach agrega un permiso a la tabla intermedia y detach lo elimina; podemos pasar un arreglo para agregar o eliminar varios permisos a la vez. El método sync primero elimina todos los permisos y luego agrega los indicados en el arreglo.
-
Raul Acevedo Flores hace 2 años
Una pregunta me podria ayudar a eliminar un registro de un tabla intermedia utilizando detach() Tengo la siguiente consulta: $ingreso=Ingresoi::Where('id',9)->first()->insumos->find(10014)->detach(10014);
Pero me muestra el siguiente error, como si no reconociera el método detach. BadMethodCallException with message 'Call to undefined method App\Models\Insumo::detach()' Nota: Si quito el detach me devuelve la consulta de manera correcta pero cuando lo agrego en automatico se rompe.