【Laravel】Laravel9.18.0から Model::with メソッドでネストしたリレーションをわかりやすく書けそう

 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 等をはさむコードを読みやすくできそうです。使い方の例はプルリクエストに含まれている次のテストケースを読むと分かりやすいです。

framework/EloquentMultiDimensionalArrayEagerLoadingTest.php at 8d518ad1ffe6d95cb47eb503cdeaa4fa2db1ebc6 · timacdonald/framework

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG