PHPこんにちわ、東京は三寒四温ならぬ七寒三温くらいの日々に辟易しているHashiです。今回はLaravelでグループ化したデータの中から各グループの最新レコードのみを取得したいケースに遭遇して、少し手こずったので備忘録も兼ねて紹介したいと思います。今回の環境は下記の通りとなります。5.6.37仕様と要点まずは、今回の仕様として下記のようなテーブルがあると仮定します。ちなみに、テーブル名は「status_histories」とします。未申請このテーブルには上の表のように「id」,「user_id」,「status」という3つのカラムから構成されているテーブルで、見ての通りユーザーのステータス履歴となっています。求める結果そして、今回このテーブルから欲しい情報は、それぞれのユーザーの最新レーコドということになるので、求める結果は下記の通りとなります。BY」を組み合わせてみるさて、各グループの最新レコードは取得していきたいと思いますが、冒頭のとおり少し手こずりました。最初に試したのは下記のコード。BY」句を組み合わせた方法です。グループ化してそれぞれの最新レコードが欲しければ、まず単純にグループ化してソートすればいいと思いますよね。この方法だと期待通りの結果は取得できないんですね。BY」が先に処理されるので、ユーザーIDでグループ化された後にソートされたデータが返ってきてしまうからです。上記の方法だと下表のような結果になるということになります。未申請これでは、全然求めるものと違いますね。BY」の組み合わせではダメということがわかったので、次に試したのが「MAX」を使う方法です。コードはこちらになります。status'))->groupBy('user_id')->get();この場合、結果がどうなるかというと下表のようになります。「id」に関しては期待通りのidが返ってきますが、「user_id」と「status」に関しては、最新レコードとは違うレコードのものを取得してしまいます。いうことでこれもダメですね。サブクエリを使ってみるそして、最後に試したのがサブクエリを使う方法です。上の「MAX」を使う方法だとidに関しては期待通りの結果が得られるので、上記の方法をサブクエリとして使用してみます。今回は下記のように「whereIn」と組み合わせてみました。id'))->from('status_histories')->groupBy('user_id');})->get();サブクエリで取得したid(各グループの最新レコード)を、whereInを使って取得しています。これでようやく期待通りの結果が得られました。スマートな方法はないものか。まとめということで、今回はLaravelでグループ化したデータの中から各グループの最新レコードを取得する方法を紹介しました。スマート方法がありましたら教えてください。それでは、今回はここまで!Hashiでした。拠点にサーフィンとスノーボードが好きなフリーランスのWebクリエイターです。普段はプログラム書いたりデザインしたり映像作ったりしています。いろいろな人の話しを聞くのが好きなので、このブログを通して多くの人と繋がりが出来たら嬉しいです。noteとInstagramもやっているのでフォローしてくれたらありがたいです!noteinstagram詳しく見るプログラミングの記事一覧へ他のブログも見る人気記事2018.01.09FITNESS【ダイエット】確実に痩せたいなら、まずやるべきこと8選。コメントをキャンセルメールアドレスが公開されることはありません。*次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。拠点にサーフィンとスノーボードが好きなフリーランスのWebクリエイターです。普段はプログラム書いたりデザインしたり映像作ったりしています。nori-life.com。