Laravelは、リレーショナルデータベースを扱うための強力なEloquent ORM(Object-Relational Mapping)を提供しています。
多対多のリレーションシップを実現する際には、中間テーブルを使用します。
この記事では、Laravelの中間テーブルにアクセスする方法について説明します。
中間テーブルとは?
中間テーブルは、多対多のリレーションシップを表現するために使用されるテーブルです。
例えば、ユーザーが複数の役割を持ち、役割が複数のユーザーに割り当てられる場合、中間テーブルを用いてユーザーと役割の関係を管理します。
中間テーブルの作成
Laravelでは、マイグレーションを使って中間テーブルを作成します。
以下のコマンドを実行して、role_user
という名前の中間テーブルを作成しましょう。
php artisan make:migration create_role_user_table --create=role_user
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
これで中間テーブル用のマイグレーションが生成されるよ!
生成されたマイグレーションファイルを開いて、up
メソッドに以下のようにテーブル構造を定義します。
![Laravelの中間テーブルにアクセスする方法](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/05/image-11.png?resize=1024%2C361&ssl=1)
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('role_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});
}
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
中間テーブルには、外部キー制約を使って関連するテーブルとのリレーションシップを定義するんだね!
Eloquentモデルで中間テーブルを定義
次に、Eloquentモデルで中間テーブルを定義します。
User
モデルとRole
モデルに、多対多のリレーションシップを表すbelongsToMany
メソッドを追加します。
User.php:
![Laravelの中間テーブルにアクセスする方法](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/05/image-12.png?resize=946%2C458&ssl=1)
class User extends Authenticatable
{
// ...
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
Role.php:
![Laravelの中間テーブルにアクセスする方法](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/05/image-13.png?resize=894%2C468&ssl=1)
class Role extends Model { // ... public function users() { return $this->belongsToMany(User::class); } }
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
Eloquentモデデルでリレーションシップを定義すると、アクセスが簡単になるね!
![](https://i0.wp.com/www12.a8.net/0.gif?resize=1%2C1&ssl=1)
![](https://i0.wp.com/www19.a8.net/0.gif?resize=1%2C1&ssl=1)
![](https://i0.wp.com/www16.a8.net/0.gif?resize=1%2C1&ssl=1)
![](https://i0.wp.com/www19.a8.net/0.gif?resize=1%2C1&ssl=1)
中間テーブルへのアクセス
LaravelのEloquentを使うことで、中間テーブルに簡単にアクセスすることができます。
以下に、中間テーブルを活用した一般的な操作をいくつか紹介します。
リレーションの追加
attach
メソッドを使って、中間テーブルにレコードを追加できます。
![Laravelの中間テーブルにアクセスする方法](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/05/image-14.png?resize=720%2C274&ssl=1)
$user = User::find(1);
$role = Role::find(1);
// ユーザーに役割を割り当てる
$user->roles()->attach($role->id);
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
attachメソッドで簡単に関連付けができるんだね!
リレーションの削除
detach
メソッドを使って、中間テーブルからレコードを削除できます。
![Laravelの中間テーブルにアクセスする方法](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/05/image-15.png?resize=734%2C282&ssl=1)
$user = User::find(1);
$role = Role::find(1);
// ユーザーから役割を削除する
$user->roles()->detach($role->id);
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
detachメソッドでリレーションを解除するのも簡単だね!
中間テーブルのレコード取得
withPivot
メソッドを使って、中間テーブルのカラムにアクセスできます。
![Laravelの中間テーブルにアクセスする方法](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/05/image-16.png?resize=1024%2C460&ssl=1)
// Userモデルにrolesメソッドを定義する際に、withPivotを追加
public function roles()
{
return $this->belongsToMany(Role::class)->withPivot('created_at');
}
// 使用例
$user = User::find(1);
$role = $user->roles->first();
echo $role->pivot->created_at;
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
withPivotで中間テーブルのカラムにもアクセスできるようになるんだ!
まとめ
Laravelの中間テーブルは、多対多のリレーションシップを表現する際に非常に役立ちます。
Eloquentを使えば、中間テーブルにアクセスしたり、リレーションを管理したりするのが簡単になります。
![とびちゃん](https://i0.wp.com/tobilog.net/wp-content/uploads/2023/04/IMG_0161.png?resize=300%2C300&ssl=1)
Laravelの中間テーブルは強力だね!これで多対多のリレーションシップも簡単に扱えるよ!
![](https://i0.wp.com/www17.a8.net/0.gif?resize=1%2C1&ssl=1)
![](https://i0.wp.com/www12.a8.net/0.gif?resize=1%2C1&ssl=1)
![](https://i0.wp.com/www17.a8.net/0.gif?resize=1%2C1&ssl=1)
コメント