2015-09-20 2 views
0

Я пытаюсь получить обложки книг, принадлежащих автору. Все идет нормально. Но он генерирует отдельный запрос для каждой книги и занимает 2 секунды, чтобы загрузить страницу, я думаю, что я делаю что-то неправильно.Eloquent нетерпеливо загружает несколько таблиц

Я использую загрузку с моей таблицей комментариев (комментарий принадлежит пользователю), но поскольку я использую полиморфные отношения с таблицей изображений (изображение может принадлежать к другим типам других таблиц, таких как пользователь, предмет или группа , поэтому я не могу использовать внешние ключи в таблице изображений, так как это не правильное соглашение), на этот раз я не смог найти способ добиться того же.

Изображение Модель

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 


class Image extends Model 
{ 

    public function imageable() 
    { 
     return $this->morphTo(); 
    } 

} 

лицо модели (Автор)

namespace App\Models; 
use Illuminate\Database\Eloquent\Model; 

class Person extends Model { 
    public function books() 
    { 
     return $this->belongsToMany('\App\Models\Thing', 'person_thing'); 
    } 

вещь Модель (Книги)

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Thing extends Model { 

    public function cover() { 
     return $this->morphMany('\App\Models\Image', 'imageable'); 
    } 
} 

Контроллер

$findBooks = Person::with(array('books' => function($query) 
      { 
       $query->groupBy('original_name'); 
      }))->find(52957); 

      $allbooks = $findBooks->books; 


return view('frontend.index')->with('allbooks', $allbooks) 
     } 

Текущего вид

@foreach($allbooks as $allBooks) 
    @foreach($allBooks->cover as $value) 
     <img class="hund" src="{{$value->link}}" alt=""> 
    @endforeach 
@endforeach 

Изображение: enter image description here

+2

Я не пробовал это с нетерпеливым погрузочным ограничением раньше, но вы можете сделать вложенное отношение жадной загрузки, используя точечную нотацию. Поэтому попробуйте 'array ('books.cover' => function ...'. Единственное, что я не уверен, - это то, что '' query-> groupBy (...) 'тогда ссылается на каждую обложку или каждый книга. – AgmLauncher

+0

Вы можете попытаться лениво зарядить отношения крышки через возвращенную коллекцию. '$ allbooks = $ findBooks-> books-> load ('cover');' Я не уверен, что 'groupBy' повлияет на это также, но это мысль. –

ответ

0

Я не думаю, что ваша проблема с жадной загрузкой или трансформироваться для многих, если ваша страница занимает 2s для загрузки,, Вы установили Laravel/DebugBar к посмотреть, что занимает 2 секунды или сколько запросов вы запускаете?

1

От this post on Laracasts

$query->with([ 
    'child' => function ($q) { 
     $q->where(’someCol', ’someVal’); //constraint on child 
    },'child.grandchild' => function ($q) { 
     $q->where(‘someOtherCol’, ‘someOtherVal’); //constraint on grandchild 
    } 
]); 
Смежные вопросы