Laravelのデータベースリレーションを活用して、別のModelのデータを取得する

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 は、配列の中に複数のデータが含まれている場合があります。
配列に対して、 リレーション設定のメソッド をアクセスすることは出来ません。
データを一つづつに分解して、そのデータに対してリレーションメソッドを適用しましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です