LaravelのEloquentでwithを使う方法

Laravelでwithを使う方法を解説していきます。

Eloquentでwithを使う目的

まず、withは何のために使うかというと
リレーションを用いて、Eloquentからデータ抽出したいときに使います。
(n + 1 問題の解決もできます。)

withの使い方

前提として、下記のリレーションが設定されていることとします。
チャットルームとチャットメッセージが、chat_room_idで接続されています。
チャットルームとチャットユーザーが、chat_room_idで接続されています。

class ChatRoom extends Model
{ 

public function chatMessages()
{
return $this->hasMany('App\Models\ChatMessage', 'chat_room_id', 'id' );
}

public function chatRoomUsers()
{
return $this->hasMany('App\Models\ChatRoomUser', 'chat_room_id','id' );
} 
} 

controller上で、どのように使うのかみていきましょう。

 $chatRooms = ChatRoom::with('chatMessages')
    ->get(); 

こうすることによって、chatroomの取得と同時に、chatMessagesもリレーションして取得することが出来ます。

withを複数使うことはできるのか。

結論:はい。できます。

どのように使うのかというと非常にシンプルです。

$chatRooms = ChatRoom::with('chatMessages')
    ->with('chatRoomUsers'); 
    ->get(); 

これで、チャットルームに、チャットメッセージとチャットルームユーザーがリレーションしたデータを抽出することが可能です。

withで抽出したデータを操作したい

withでリレーションしたデータを操作したい方法です。

例えば、withでリレーションしたデータを降順にしたい、昇順にしたいといった並べ替えの変更などあると思います。

 $myApplyChatRooms = ChatRoom::with('chatRoomUsers')
    ->with(['chatMessages' => function ($query) {
        $query->orderBy('created_at', 'desc');
    }])
    ->get(); 

withの中に、Queryを追加してあげることで、自由に操作することが可能です。

コメントを残す

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