Красноречивая нетерпеливая загрузка нескольких таблиц

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

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

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

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

Изображение: введите здесь описание изображения


person salep    schedule 20.09.2015    source источник
comment
Раньше я не пробовал это с ограничением нетерпеливой загрузки, но вы можете выполнить нетерпеливую загрузку вложенных отношений, используя точечную нотацию. Итак, попробуйте array('books.cover' => function.... Единственное, в чем я не уверен, так это в том, относится ли $query->groupBy(...) к каждой обложке или к каждой книге.   -  person AgmLauncher    schedule 22.09.2015
comment
Вы можете попытаться лениво загрузить отношения обложки через возвращенную коллекцию. $allbooks = $findBooks->books->load('cover'); Не уверен, что groupBy повлияет и на это, но думаю.   -  person Aken Roberts    schedule 22.09.2015


Ответы (2)


Из этот пост на Laracasts

$query->with([
    'child' => function ($q) {
        $q->where(’someCol', ’someVal’); //constraint on child
    },'child.grandchild' => function ($q) {
        $q->where(‘someOtherCol’, ‘someOtherVal’); //constraint on grandchild
    }
]);
person Hauthorn    schedule 22.09.2015

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

person Paris Paraskeva    schedule 22.09.2015