【Laravel】 ネストしたEagerLoadを書いてみる
やりたいこと
以下のテーブル構成があったときに、 マンションテーブルの情報から郵便番号テーブルの住所名を取得したいときに、 ネストしたEagerLoadを使用することができたので、残します。
マンションテーブル(apartments)
| 項目名 | カラム名 | 外部キー |
|---|---|---|
| id | マンションID |
マンションの基本情報テーブル(apartment_infos)
| 項目名 | カラム名 | 外部キー |
|---|---|---|
| id | マンションの基本情報のID | |
| apartment_id | マンションテーブルのID | apartments.id |
| postal_code | 郵便番号 | postal_codes.postal_code |
郵便番号テーブル(postal_codes)
| 項目名 | カラム名 | 外部キー |
|---|---|---|
| postal_code | 郵便番号 | |
| name | 住所名(松山市...) |
公式の説明
初歩の初歩なのか、あっさりと書かれていて、 私はぱっと見ただけでは理解出来ませんでした。
実際のコード
//マンションモデル
class Apartment extends Model{
public function apartmentInfo()
{
//マンションの基本情報テーブルとの関係を明示
return $this->hasOne(ApartmentInfo::class,"id" , "id")->withDefault();
}
}
//マンションの基本情報モデル
class ApartmentInfo extends Model{
public function postalCode()
{
//郵便番号テーブルとの関係を明示
return $this->hasOne(PostalCode::class,"postal_code" , "postal_code")->withDefault();
}
}
//郵便番号のモデル
class PostalCode extends Model{
}
public function sample(){
$apartments = Apartment::with(
["apartmentInfo", "apartmentInfo.postalCode"])->get();
var_dump($apartments->ApartmentInfo->PostalCode->name);
}
感想
最初は、郵便番号のモデルに、findするようなメソッドを用意していたが、 N+1クエリ問題が発生してしまうので、どうにかならないかなあと思っていたところ、改善できてよかった。
Discussion