Laravel 5.4 Eloquent Query Optimization

Я хочу оптимизировать запрос Laravel для списка товаров. Мне нужно отобразить список продуктов, а также бренды. Ниже приведен код:

$searchTerm = 'Coffee';
$productListing = Product::where('title', 'like', '%'.$searchTerm.'%')->paginate(10);

Мне также нужен отдельный список для всех брендов для товаров, возвращаемых поиском.

Способ 1:

Получить все идентификаторы брендов в массиве

$productBrandsArray = $productListing->pluck('brand_id')->toArray();

Проблема в том, что бренды получат только 10 записей из-за нумерации продуктов.

$productBrands = Brand::whereIn('brand_id', $productBrandsArray);

Метод 2 (подзапрос):

$productBrands = Brand::whereIn('brand_id', function ($query) use($searchTerm) {
$query->select('brand_id')
->from(with(new Product())->getTable())
->where(Product::getTableName().'.title', 'like', '%'.$searchTerm.'%');});

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

Пожалуйста, предложите.

Благодарю.

1

Решение

Разбивка на страницы работает на основе лимитов и смещений, поэтому вам нужно сделать второй запрос, чтобы получить целые бренды. В способе 1 для получения товарных брендов вы можете изменить запрос, как указано ниже, чтобы вам не нужно было получать идентификаторы брендов отдельно.

$productBrands = Brand::where('products.title', 'like', '%' . $searchTerm . '%')
->join("products", "brands.brand_id", "=", "products.brand_id")
->get();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]