こんにちは!
個人開発者の南です。
今回は、LaravelのEloquentで中間テーブル先のデータを取得する時は、「belongsToMany」メソッドを使用します。
この記事では、belongsToManyの基本的な使い方と、belongsToManyをカスタマイズして使う方法について紹介していきます。
belongsToManyについて
belongsToManyは、LaravelのORMで使用するメソッドの1つです。
belongsToManyを使用する場面は、例えば下記のように中間テーブルのデータを参照する時などに使用します。
usersテーブル
id | name | |
---|---|---|
1 | テスト | test@example.com |
rank_userテーブル(中間テーブル)
id | user_id | rank_id |
---|---|---|
1 | 1 | 2 |
ranksテーブル
id | name |
---|---|
1 | ランク1 |
2 | ランク2 |
最後に、使用する場合はまずModel側に下記のように記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * userに所属する会員ランクを取得 */ public function ranks() { return $this->belongsToMany('App\Rank'); } } |
Model側に記載ができたら、実際に使用する時に下記のように書くことでデータを取得することができます。
1 2 3 4 5 6 |
$user = \App\User::find(1); foreach ($user->ranks as $rank) { $rank->id;//会員ランクのID表示 $rank->name;//会員ランクの名前表示 } |
belongsToManyの使い方について
Laravelの規約に沿っている場合は、先程紹介した方法で中間テーブルを介してデータを取得することができます。
そのためには、それぞれ下記のようにテーブル名を定義する必要があります。
・usersテーブル
・rank_userテーブル
・ranksテーブル
規約に沿っていない場合に、belongsToManyを使う方法
ただ、開発状況によっては上記のように規約に沿っていない場合もあるかと思います。
その時は、belongsToManyをカスタマイズすることで解決することができます。
belongsToManyには、それぞれ下記のように引数をすることができます。
1 |
belongsToMany('関係するモデル', '中間テーブルのテーブル名', '中間テーブル内で対応しているID名', '関係するモデルで対応しているID名'); |
例えば、中間テーブル名が規約に沿っている「rank_user」ではなく、「user_rank_tbl」という名前だったとしましょう。
その場合は、下記のように記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * userに所属する会員ランクを取得 */ public function ranks() { return $this->belongsToMany('App\Rank', 'user_rank_tbl', 'user_id', 'rank_id'); } } |
これで先程紹介したように、下記のコードでRankテーブルの各データにアクセスすることができるようになります。
1 2 3 4 5 6 |
$user = \App\User::find(1); foreach ($user->ranks as $rank) { $rank->id;//会員ランクのID表示 $rank->name;//会員ランクの名前表示 } |
まとめ
今回は、LarravelのbelongsToManyの使い方とカスタマイズして使う方法について紹介しました。
この記事があなたのお役に立てば幸いです。