manytomanyはpivotテーブルを使って、子供のレコードを管理する
$ php artisan make:model Role -m
$ php artisan make:migration create_role_user_table –create=role_user
role_user
Schema::create('role_user', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->unsigned()->nullable()->index(); $table->integer('role_id')->unsigned()->nullable()->index(); $table->timestamps(); });
role
Schema::create('roles', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });
$ php artisan migrate
User.php
public function roles(){ return $this->belongsToMany('App\Role'); }
Role.php
class Role extends Model { // protected $fillable = ['name']; }
insert into users (name, email, password) values (‘peter’, ‘peter@gmail’, ‘1234’);
Route::get('/create', function(){ $user = User::find(1); $role = new Role(['name'=>'adminstrator']); $user->roles()->save($role); });
mysql> select * from role_user;
+—-+———+———+————+————+
| id | user_id | role_id | created_at | updated_at |
+—-+———+———+————+————+
| 1 | 1 | 1 | NULL | NULL |
+—-+———+———+————+————+
1 row in set (0.00 sec)
read
Route::get('/read', function(){ $user = User::findOrFail(1); foreach($user->roles as $role){ dd($role); } });
update
has()で確認する
Route::get('/update', function(){ $user = User::findOrFail(1); if($user->has('roles')){ foreach($user->roles as $role){ if($role->name == 'adminstrator'){ $role->name = 'Adminstrator'; $role->save(); } } } });
delete
Route::get('/delete', function(){ $user = User::findOrFail(1); $user->roles()->delete(); });
attach & delete
Route::get('/attach', function(){ $user = User::findOrFail(1); $user->roles()->attach(2); }); Route::get('/detach', function(){ $user = User::findOrFail(1); $user->roles()->detach(2); });
createだけでなく、attachとdeleteがあるってのは、理にかなってます。