【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 住所名(松山市...)
スポンサーリンク

公式の説明

Laravel 5.4 Eloquent:リレーション

初歩の初歩なのか、あっさりと書かれていて、
私はぱっと見ただけでは理解出来ませんでした。

スポンサーリンク

実際のコード

//マンションモデル
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クエリ問題が発生してしまうので、どうにかならないかなあと思っていたところ、改善できてよかった。

コメント

タイトルとURLをコピーしました