Relaciones muchos a muchos (Many To Many)

Ejemplo un user puede tener muchos roles, y un rol puede tener muchos users, y también un rol puede tener muchos permisos y viceversa.

php artisan make:model Role -m
En esa migration:
...
$table->string('name', 50);
...

// la tabla q haga de intermediario (enlace) no necesita modelo, por eso crear solo la migration
// Hay que RESPETAR la nomenclatura para q funcione: create y luego los modelos colocados alfabéticamente
php artisan make:migration create_role_user_table
En esa migration: Schema::create('role_user', function (Blueprint $table) {
   $table->id();
   $table->unsignedBigInteger('role_id');
   $table->foreign('role_id')->references('id')->on('roles')
    ->onDelete('cascade');
   $table->unsignedBigInteger('user_id');
   $table->foreign('user_id')->references('id')->on('users')
     ->onDelete('cascade');
   $table->timestamps();
});

php artisan make:model Permiso -m
En esa migration: ...
$table->string('name');
...

Para la tabla intermedia de enlace solo hace falta la migración (no modelo):
php artisan make:migration create_permiso_role_table
En esa migration:
$table->unsignedBigInteger('permiso_id');
$table->foreign('permiso_id')->references('id')->on('permisos')->onDelete('cascade');
$table->unsignedBigInteger('role_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

php artisan migrate
En app\Models\User.php:
// Relación muchos a muchos
public function roles() {
   return $this->belongsToMany('App\Models\Role');
}

En app\Models\Role.php:
// Relación muchos a muchos
public function users() {
   return $this->belongsToMany('App\Models\User');
}
// Relación muchos a muchos
public function permisos() {
   return $this->belongsToMany('App\Models\Permiso');
}

En app\Models\Permiso.php:
// Relación muchos a muchos
public function roles() {
   return $this->belongsToMany('App\Models\Role');
}

Desde el phpmyadmin metemos datos de pruebas en users y roles
Una vez metidos vamos a rellenar los campos de role_user podemos hacerlo 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,3]);
// sync borra todos los roles q tenga ese user y añade los q se indique
$user->roles()->sync([1,2]);

Más información en: https://www.youtube.com/watch?v=iHqIFcVeC7A

No hay comentarios:

Publicar un comentario