Eloquent ORM: Relace: Many To Many

Many To Many

Např. jeden uživatel má více rolí a jedna role má více uživatelů.

Potřebné tabulky v databázi:

  • users
  • roles
  • role_user (název je v abecedním pořadí)
    • user_id
    • role_id

Model

Model User

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{

  /**
   * The roles that belong to the user.
   */
  public function roles()
  {
    return $this->belongsToMany(App\Role::class);
  }

}

Model Role

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{

  /**
   * The users that belong to the role.
   */
  public function users()
  {
    return $this->belongsToMany(App\User::class);
  }

}

Uložení dat

Metody attach() a detach()

Připojení role k uživateli:

$user->roles()->attach($role->id);
  • vloží záznam do spojovací tabulky
$user->roles()->attach($role->id, ['expires' => $expires]);
  • vloží záznam a doplňující data do spojovací tabulky
$user->roles()->attach([1, 2, 3]);
$user->roles()->attach([
    1 => ['expires' => $expires],
    2 => ['expires' => $expires],
]);
  • jako hodnotu lze zadat i pole

Odpojení role od uživatele:

$user->roles()->detach($roleId);
$user->roles()->detach([1, 2, 3]);

Odpojení všech rolí od uživatele:

$user->roles()->detach();

Metoda sync()

Synchronizace:

$user->roles()->sync([1, 2, 3]);
  • přijímá pole s id s které mají být připojeny, ostatní záznamy jsou ze spojovací tabulky odstraněny
$user->roles()->sync([1 => ['expires' => true], 2, 3]);
  • lze doplnit další data

Synchronizace bez odpojení:

$user->roles()->syncWithoutDetaching([1, 2, 3]);

Získání dat

$user = App\User::find(1);

foreach ($user->roles as $role) {
}
$roles = App\User::find(1)->roles()->orderBy('name')->get();

 

Zdroje

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *