Laravelでは二つのテーブルを組み合わせて、簡単に中間テーブルを作ることができます。
どのようにして作るか、実際の手順をステップごとに解説していきます。
今回は、ユーザーテーブルとロール(役割)テーブルを組み合わせて、【ユーザーロールテーブル】を作っていきます。
その際、ユーザーテーブルとロールテーブルの間には、belongsToManyメソッドを使って、リレーションを構築します。
言葉はむずかしいですが、手順自体はわりとシンプルなので、まずは一度つくってみてください。
LaravelでPivotテーブルを簡単に作る方法【belongsToMany】
次の6ステップで操作を解説していきます。
- ユーザーモデルにロールモデルへのリレーション追加
- ロールモデルとロールテーブル作成
- ロールモデルにユーザーモデルへのリレーション追加
- ロールテーブルのマイグレーションファイル編集
- ユーザー×ロールテーブル作成
- テスト
(バージョンはLaravel8を使って説明していきます。)
①ユーザーモデルとテーブル作成
ユーザーモデルはデフォルトで準備されています。
App\Models\Userとのリレーションを加えます。
1 2 3 |
public function roles(){ return $this->belongsToMany('\App\Models\Role'); } |
Pivotテーブルにタイムスタンプをいれる
なお、デフォルトでは自動的にタイムスタンプ(created_at、updated_atへの値) がはいりません。
->withTimestamps(); を付けておくと、タイムスタンプ(created_at, updated_at )が自動的に維持されます。
1 2 3 |
public function roles(){ return $this->belongsToMany('\App\Models\Role')->withTimestamps(); } |
②ロールモデルとロールテーブル作成
ロールモデルとロールテーブルを作成します。
1 |
php artisan make:model Role -m |
③ロールモデルにユーザーモデルへのリレーション追加
App\Models\Roleファイルを開き、次を追加してください。
Userモデルとのリレーションを加えます。
1 2 3 |
public function users(){ return $this->belongsToMany('App\Models\User'); } |
④ロールテーブルのマイグレーションファイル編集
database/migrations の中にできたマイグレーションファイルを編集します。
次の1行を加えてください。
1 |
$table->string('name'); |
⑤ユーザー×ロールテーブル作成
ユーザーテーブルとロールテーブルを連結させた【role_user】テーブルを作ります。
◆次のようにコマンドを打ってください。
1 |
php artisan make:migration create_users_roles_table --create=role_user |
◆database/migrations の中にできたマイグレーションファイルに次の2行を加えます。
1 2 |
$table->unsignedBigInteger('user_id'); $table->unsignedBigInteger('role_id'); |
◆マイグレートします。
1 |
php artisan migrate |
⑥テスト
これで準備完了です。
最後にテストしてみましょう。
phpMyAdminにログインし、データベース内に【role_user】テーブルを確認してみてください。
テスト用に、roleテーブル、userテーブル、role_userテーブルにダミーで情報をいれておきます。
その後、ルート設定ファイル(routes/web.php)に下記を加えます。
1 2 3 4 5 6 |
Route::get('/pivot', function(){ $user=User::find(1); foreach ($user->roles as $role) { echo $role->pivot; } }); |
Laravelを起動し、【/pivot】ページを確認してみます。
上記のように、role_userテーブルにいれた情報が取り出せれば、無事成功。
ロールを割り当てたり、取り外したりするには attachやdetachというメソッドが使えます。
詳しくは、こちらの記事にて解説しています。