0

私は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 の選択クエリを生成していることです。これは、ページの読み込み速度は悪くありませんが、少し過剰に思えます。

ここで私が間違っていることを誰かが説明し、正しい方向に向けることができますか?

4

2 に答える 2

5

興味のある方へ...

私は今この問題を解決しました:

私がしていたことは、関係を正しくロードしていたようですが、それらに正しくアクセスしていないようです。たとえば、次のようにリレーションシップを熱心にロードするとします。

$applicants = YourDetail::with('FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades');

次に、次のように要素にアクセスする必要があります。

@foreach($applicants as $applicant)
@foreach($applicant->FurtherEds as $fe)
  {{ $fe->FurtherTypes->name }}
@endforeach
@endforeach

私が抱えていた問題は、間違った大文字で下のモデルにアクセスすることでした:

例えば。

@foreach($applicants as $applicant)
@foreach($applicant->furtherEds as $fe)
  {{ $fe->furtherTypes->name }}
@endforeach
@endforeach

Laravel はモデル内の関係を認識できるほど賢いので、何にアクセスすればよいかはわかりますが$applicant->furtherEds、熱心にロードされたモデル オブジェクトと同じであるとは認識せず$applicant->FurtherEds、代わりに新しい SQL クエリを生成します。

少し複雑なページでこれを数回実行した時点で、2000 以上の SQL クエリがありました。教訓...二度とない

ps 今、私はそれを適切に使用する方法を考え出しました.

于 2013-10-09T14:40:15.297 に答える