[Laravel] リレーション先の最新日付を取得したい

結論

Post と Comment (1対多の関係)を例にすると、

コントローラーからフツーに $posts を view に渡して…。

blade のループ内で

@forelse($posts as $post)
    <div>{{ $post->title }}</div>
    <div>{{ $post->comments()->latest('updated_at')->first()->format('Y/m/d H:i') }}</div>
@empty
    <div>データが見つかりません</div>
@endelse

てな感じ。

詳細

投稿(Post)の一覧をテーブルで表示したい。

その中のカラムに「最新のコメント日付」を入れたい。

って思っただけなんです。

SQL書いたら一瞬で終わるんですが、 Laravel のお作法でシュッと書くにはどうすれば…?と気になりまして。

調べても、

  • DB:raw() でSQL書け
  • with() にクロージャ渡せ

みたいな話ばかりで、なんだかかなり面倒。(いや、それほど大したことは無いんですけどね…。)

1対多や多対多のリレーション用に withCount() は用意されてるんですけど、 withMax() は無いんですよね…。

$post->comments() でリレーション先の Comment は取れてるんだから、なんとかならんものか?と…ずいぶん考えた結果、冒頭の結論に至ったのでした。

内部的な効率考えると、生のSQL書いた方が良いとは思うんですけどねー。

たまに「ぬぉっ!こんだけで済むのか!」ってエレガントな書き方を見つけて感動することがあるので、最近は「いかにコード量の少ない、すっきりしたソースになるか?」の方向に目が行っているのでした。