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

    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

    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.