[Laravel Eloquent] with関数で複数テーブルからcolumnを指定して取得(Eager Loading)


サンプルコード

例えば、以下のような3つの親子関係テーブルがあった場合。

・grand_fathers(id, name, age, created_at, updated_at)
・fathers(id, grand_father_id, name, age, created_at, updated_at)
・children(id, father_id, name, age, created_at, updated_at)

get-family-data.php

$family = GrandFather::with(['fathers' => function ($fathers_query) {
    $fathers_query->with(['children' => function ($children_query) {
        $children_query->select(['id', 'father_id', 'name', 'age']); //「father_id」は必ず必要!
    }])->select(['id', 'grand_father_id', 'name', 'age']); //「grand_father_id」は必ず必要!
}])
    ->where('id', '1')
    ->get(['id', 'name', 'age']);

これで、各テーブルからcolumnを指定して取得することができます。

調べていろいろ試しましたが、納得のいくものがなかなか見つからず、
たぶんこれが一番キレイじゃないかなー、、?

もっといいやり方があればコメントいただきたいです。

リレーション設定は忘れずに!

もちろんですが、withを使用する前にはModelのリレーション設定が必要なのでお忘れなく!