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を追加してあげることで、自由に操作することが可能です。