Laravelのリレーションを活用することで、リレーション先の異なるテーブルとのデータ連携が可能になります。
非常に重要な機能ですので、是非試してみてください。
今回はリレーションについて2点お伝えしていきたいと思います。
( 1 ):Model内でのリレーションの設定方法
( 2 ):Eloquent で、リレーションを活用して別テーブルのデータを取得する方法
つまり、設定 → データ取得する 一連の流れをお伝えしたいと思います。
( 1 ):Model内でのLaravelリレーションの設定方法
こちらは下記サイトの「Eloquent:リレーション」を一度確認してみてください。
リレーションの方法は幾つかあります。
一番使う形式は、下記3つかと思います。基礎的な部分でいうとこの辺を抑えておけば問題ないと思います。
- 1対1
- 1対多
- 多対多
イメージしやすい例は
1対1:
User_id と マイナンバー
※user_id もマイナンバーもどちらもユニークになる存在なので他のデータとの組み合わせは起きません。
1対多:
User_id と コメント履歴
※AさんのコメントはAさんにしか紐づきません。ただし、Aさんは複数コメントする場合はあります。
多 対 多 :
User_id と 好きな飲食店
※Aさんは、飲食店1、2,3が好き、Bさんは、飲食店2、3,5が好き。というように、紐づきが両データに紐づく可能性があります。
設定方法は、Model内にリレーションのメソッドを記述します。
詳細は 「Eloquent:リレーション」 こちらに書いてある通りです。
1つ注意して確認してみて欲しいのは、
データリレーションには、主従の関係性があるということです。
( 2 ):Eloquent で、リレーションを活用して別テーブルのデータを取得する方法
リレーションを設定する目的の1つは、データを取得しやすくすることです。
簡単な例で紹介します。
A // リレーション設定
※ChatRoomUser クラスから、UserクラスへID同士を紐づけしております。
<?php namespace App\Models\Chat; use Illuminate\Database\Eloquent\Model; class ChatRoomUser extends Model { protected $fillable = ['chat_room_id', 'user_id', 'usertype']; public function InterviewUser() { return $this->belongsTo('App\Models\User' , 'user_id' ,'id'); } }
B // リレーションデータの取得
これを設定したことによって、Eloquent でChatRoomUser クラスを活用して、Userクラスの情報を取得できます。
$messageUser = ChatRoomUser::whereIn('chat_room_id', $chat_room_id) ->where('usertype', 'Interviewer') ->get(); foreach($messageUser as $user){ $email = $user->InterviewUser->email; }
リレーションを活用した取得方法は下記です。
Eloquantで取得データ- > リレーション設定のメソッド -> リレーションした先のModelのデータカラム
今回でいうと:
・ Eloquantで取得データ $messageUser
・ リレーション設定のメソッド InterviewUser
・ リレーションした先のModelのデータカラム email※Userクラスのデータカラム
リレーションデータ取得時の注意
1件のデータに対してメソッドを適用することが出来る
$messageUser は、配列の中に複数のデータが含まれている場合があります。
配列に対して、 リレーション設定のメソッド をアクセスすることは出来ません。
データを一つづつに分解して、そのデータに対してリレーションメソッドを適用しましょう。