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();