カテゴリ: Laravel 更新日: 2025/11/06

Laravelで中間テーブルを使った多対多(belongsToMany)リレーションの定義

Laravelで中間テーブルを使った多対多(belongsToMany)リレーションの定義
Laravelで中間テーブルを使った多対多(belongsToMany)リレーションの定義

先生と生徒の会話形式で理解しよう

生徒

「Laravelで複数のデータが複数のデータに関連する場合って、どうやって扱えばいいんですか?」

先生

「それは多対多のリレーションを使います。LaravelではbelongsToManyを使って、中間テーブルを通して関係を定義できます。」

生徒

「中間テーブルって何ですか?」

先生

「中間テーブルは、二つのテーブルの関係を管理するための専用テーブルです。例えば、ユーザーとロールの関係を管理する場合、role_userのようなテーブルが中間テーブルになります。」

1. 多対多リレーションとは?

1. 多対多リレーションとは?
1. 多対多リレーションとは?

多対多のリレーションは、一つのデータが複数のデータに関連し、逆もまた同じである関係です。例えば、ユーザーは複数のロールを持つことができ、ロールも複数のユーザーに割り当てられる、というイメージです。

このような場合、直接テーブル同士を繋ぐのではなく、中間テーブルを作成してIDを管理する方法が便利です。Laravelではこれを簡単に実装できます。

2. 中間テーブルの作り方

2. 中間テーブルの作り方
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を使ったリレーション定義

3. belongsToManyを使ったリレーション定義
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. 関連データの取得と操作

4. 関連データの取得と操作
4. 関連データの取得と操作

例えば特定のユーザーが持つロールを取得する場合は次のように書きます。


$user = User::find(1);
$roles = $user->roles;

ロールを追加したい場合はattachメソッドを使います。


$user->roles()->attach($roleId);

削除する場合はdetach、置き換える場合はsyncを使います。これにより中間テーブルの管理も自動で行われます。

5. 多対多リレーションのポイント

5. 多対多リレーションのポイント
5. 多対多リレーションのポイント

多対多リレーションを正しく使うためのポイントは次の通りです。

  • 中間テーブルには二つのテーブルのIDを持たせる。
  • モデルにbelongsToManyを定義して関連付ける。
  • 関連データの取得や追加・削除はattachdetachsyncを活用する。

これを覚えると、ユーザーとロール、商品とタグなど、さまざまな多対多関係を簡単に管理できるようになります。

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelの認証状態をチェックする方法を完全解説!authとAuth::check()を初心者向けにやさしく説明
New2
CodeIgniter
CodeIgniterのコントローラクラスの作り方を完全ガイド!初心者でもわかる基礎から実践まで
New3
Symfony
Symfonyのフォームラベルを多言語対応!初心者でもわかる翻訳設定ガイド
New4
Laravel
Laravelでユーザー登録機能を作る方法!初心者向けにバリデーションとリダイレクトをやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravelのビューとは?Bladeテンプレートの基本を解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.7
Java&Spring記事人気No7
Laravel
Laravelのルートキャッシュ機能を活用してパフォーマンス改善!初心者でもわかる完全ガイド
No.8
Java&Spring記事人気No8
Laravel
LaravelでルートをBladeテンプレートに記述する方法(route関数)