やりたいこと
以下のテーブル構成があったときに、
マンションテーブルの情報から郵便番号テーブルの住所名を取得したいときに、
ネストした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クエリ問題が発生してしまうので、どうにかならないかなあと思っていたところ、改善できてよかった。
コメント