Laravel: повысить производительность при наличии нескольких активных запросов на загрузку - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь улучшить производительность моего приложения laravel.Я уже смог уменьшить количество запросов с 68 до 20, удалив ленивую загрузку в моих представлениях.

Однако, используя нетерпеливую загрузку, все еще остается 20 запросов, которые делают почти то же самое.Мой код выглядит так:

$products = [
        'latest' => Product::with('vehicle', 'brand', 'type', 'photos')->withoutGlobalScope(ProductScope::class)->latest()->take(5)->get(),
        'most_viewed' => Product::with('vehicle', 'brand', 'type', 'photos')->withoutGlobalScope(ProductScope::class)->mostViewed()->take(5)->get(),
        'nearest' => Product::with('vehicle', 'brand', 'type', 'photos')->withoutGlobalScope(ProductScope::class)->nearest($address)->take(5)->get(),
    ];

Это приводит к 15 запросам (по 5 каждый), так как каждый раз отношения также будут запрашиваться снова.Можно ли объединить эти запросы таким образом, чтобы их можно было уменьшить до 7 запросов вместо 15?

1 Ответ

1 голос
/ 10 апреля 2019

Поскольку различные коллекции должны передаваться по ссылке, вы должны иметь возможность объединить их в одну коллекцию Eloquent и затем использовать Lazy Eager Loading :

$products = [
    'latest'      => Product::withoutGlobalScope(ProductScope::class)->latest()->take(5)->get(),
    'most_viewed' => Product::withoutGlobalScope(ProductScope::class)->mostViewed()->take(5)->get(),
    'nearest'     => Product::withoutGlobalScope(ProductScope::class)->nearest($address)->take(5)->get(),
];

//Merge the different Product collections into one for the lazy eager loading 

$collection = new \Illuminate\Database\Eloquent\Collection();

foreach ($products as $items) {
    foreach ($items as $model) {
        $collection->push($model);
    }
}

$collection->load('vehicle', 'brand', 'type', 'photos');

//$products should now contain the different collections but with the additional relationships.

В оригинальных коллекциях в массиве $products теперь должны быть загружены все отношения, но он должен был выполнить только 4 запроса вместо 12 для отношений.

...