Laravelで中間テーブルを使った多対多(belongsToMany)リレーションの定義
生徒
「Laravelで複数のデータが複数のデータに関連する場合って、どうやって扱えばいいんですか?」
先生
「それは多対多のリレーションを使います。LaravelではbelongsToManyを使って、中間テーブルを通して関係を定義できます。」
生徒
「中間テーブルって何ですか?」
先生
「中間テーブルは、二つのテーブルの関係を管理するための専用テーブルです。例えば、ユーザーとロールの関係を管理する場合、role_userのようなテーブルが中間テーブルになります。」
1. 多対多リレーションとは?
多対多のリレーションは、一つのデータが複数のデータに関連し、逆もまた同じである関係です。例えば、ユーザーは複数のロールを持つことができ、ロールも複数のユーザーに割り当てられる、というイメージです。
このような場合、直接テーブル同士を繋ぐのではなく、中間テーブルを作成してIDを管理する方法が便利です。Laravelではこれを簡単に実装できます。
2. 中間テーブルの作り方
例えばユーザーとロールの多対多関係を作る場合、中間テーブルとしてrole_userを作ります。中間テーブルには、ユーザーIDとロールIDのカラムだけを持たせるのが基本です。
Schema::create('role_user', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
これでユーザーとロールの関係を管理する準備ができました。
3. belongsToManyを使ったリレーション定義
ユーザーモデルとロールモデルに多対多リレーションを定義します。ユーザーモデルでは次のように書きます。
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
ロールモデルでは逆方向も定義します。
class Role extends Model
{
public function users()
{
return $this->belongsToMany(User::class);
}
}
これで$user->rolesや$role->usersで関連データを簡単に取得できます。
4. 関連データの取得と操作
例えば特定のユーザーが持つロールを取得する場合は次のように書きます。
$user = User::find(1);
$roles = $user->roles;
ロールを追加したい場合はattachメソッドを使います。
$user->roles()->attach($roleId);
削除する場合はdetach、置き換える場合はsyncを使います。これにより中間テーブルの管理も自動で行われます。
5. 多対多リレーションのポイント
多対多リレーションを正しく使うためのポイントは次の通りです。
- 中間テーブルには二つのテーブルのIDを持たせる。
- モデルに
belongsToManyを定義して関連付ける。 - 関連データの取得や追加・削除は
attach、detach、syncを活用する。
これを覚えると、ユーザーとロール、商品とタグなど、さまざまな多対多関係を簡単に管理できるようになります。