2013-10-08 1 views
0

Я собираю администраторскую часть сайта в Laravel 4 и стараюсь сделать все работающим в красноречиве. Я пытаюсь построить объект с несколькими отношениями. Кажется, это работает нормально, пока я не попытаюсь загрузить вторичные отношения.Laravel - Помогите с загрузкой вторичных отношений (в настоящее время у меня есть 364 SQL-запросов)

Вот мой призыв к YourDetail Model:

$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 Выберите запросы, представляющие различные модели, например, запрос выбора, который добавляет модель «Дальнейшие результаты», выглядит следующим образом:

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 запросов на выборку, что хотя скорость загрузки страницы не плохо, кажется немного чрезмерным.

Может кто-нибудь объяснить, что я здесь делаю неправильно, и указать мне в правильном направлении.

ответ

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. Извлеченный урок ... никогда больше

p.s. теперь я разработал, как правильно его использовать. Eloquent официально является лучшей вещью когда-либо и определенно стоит настойчиво, если у вас проблемы.

+0

это вместо этого создает свежие запросы sql -> это не так. Laravel не будет создавать новый запрос, если у вас есть нетерпимые загруженные отношения модели. –

+0

^^ Может быть исправлено в более новых версиях красноречия, пожалуйста, не просто укажите, что это не так, это, безусловно, было в версии u sed при доступе с использованием имен модели StudlyCaps – WebweaverD

1

Попробуйте загрузить вторичные связанные модели, как это:

// from the docs 
You may even eager load nested relationships: 

$books = Book::with('author.contacts')->get(); 

http://laravel.com/docs/eloquent#eager-loading

+0

Разве это не то, что я делаю? Единственное отличие заключается в том, что у меня есть множество отношений. Если я ошибаюсь, смогу ли вы разработать то, на что я ошибся. – WebweaverD

+0

Nevermind, я не заметил, что у вас есть это в вашем массиве: 'Дальнейшая информация. Я проверю это с помощью фактического кода и дам вам знать, если я придумаю что-то. –

+0

Массив используется для добавления надежных ограничений нагрузки. Должно быть, если вы заберете массив, хотя я не уверен, что это поможет ... возможно. Кроме того, например, загрузка 'author.contacts' автоматически загружает отношения' author', поэтому вы можете взять те синглы, которые у вас есть. Это может быть источником запуска дополнительных запросов. – user1669496

Смежные вопросы