Laravel 9.18.0 がリリースされました。マイナーアップデートであり、多少便利になる細かい積み重ねがほとんどです。
Release v9.18.0 · laravel/framework
このリリースの中にあった Added ability to define "with" relations as a nested array (#42690)が特別便利そうですので紹介します。
内容はおおよそプルリクエストの題の通りで、 with にリレーションをネストした配列として定義する能力を追加した、というものです。実際は load メソッドの様な後付けでリレーションを呼ぶときも同様にネストした配列を使えます。これによりこれまでは次の様に記述していた部分が
User::with([
'avatar',
'posts.tags',
'posts.author',
'posts.featureImage',
'posts.comments.tags' => fn ($q) => $q->latest(),
])->get();
次の様にできます。
User::with([
'avatar',
'posts' => [
'tags',
'author',
'featureImage',
'comments' => [
'tags' => fn ($q) => $q->latest(),
],
],
])->get();
特に便利なのがチェーンするパターンです。
User::with([
'posts' => fn ($q) => $q->withCount('comments')->with([
'comments' => [
'tags',
],
]),
])->get();
詳しい挙動を試し切っていないですが、これを用いることでリレーションの途中に where 等をはさむコードを読みやすくできそうです。使い方の例はプルリクエストに含まれている次のテストケースを読むと分かりやすいです。