私はLaravel 4でサイトの管理者側を構築しており、すべてを雄弁に機能させようとしています。複数の関係を持つオブジェクトを構築しようとしています。二次関係を読み込もうとするまで、これはうまくいくようです。
YourDetail モデルへの呼び出しは次のとおりです。
$applicants = YourDetail::with(array('User', 'Application', 'SecondaryEds', 'SecondaryEds.SecondaryTypes', 'SecondaryEds.SecondaryGrades', 'FurtherEds', 'FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades', 'UniEds', 'UniEds.UniClassifications', 'UniEds.UniQualifications', 'WorkExperiences', 'WhyYou', 'StartDate', 'Referer'))->whereIn('user_id', $applicants);
私のすべての関係はさまざまなモデル内で定義されており、直接使用すると正常に機能します。私が抱えている問題は、二次的な関係にあります。
FurtherEds.FurtherTypes、FurtherEds.FurtherGrades、UniEds.UniClassifications、UniEds.UniQualifications、
等
クエリを実行すると、まさに期待どおりの結果が得られます。たとえば、さまざまなモデルを表す約 20 の選択クエリが生成され、「FurtherEds.FurtherGrades」モデルを取り込む選択クエリは次のようになります。
select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ここまでは順調ですね...
コレクション オブジェクトを介してこれらのモデルにアクセスしようとすると、問題が発生します。
したがって、次のように各オブジェクトをビューに渡すコレクションをループするとします。
foreach($applicants as $applicant){
View::make('ApplicantView', compact('applicant'));
}
次に、ビュー内で、FurtherEds をループして、FurtherGrades モデルのプロパティをエコーアウトしようとします。
ApplicantView.blade.php
@foreach($applicant->FurtherEds as $fe)
{{ $fe->FurtherGrades->name }}
@endforeach
これにより、熱心な読み込みを試みたにもかかわらず、申請者ごとに新しい sql クエリが作成されます。
select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` = ? limit 1 (for each applicant)
最終結果は、私のページが現在 364 の選択クエリを生成していることです。これは、ページの読み込み速度は悪くありませんが、少し過剰に思えます。
ここで私が間違っていることを誰かが説明し、正しい方向に向けることができますか?