Я хочу оптимизировать запрос 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 для получения товарных брендов вы можете изменить запрос, как указано ниже, чтобы вам не нужно было получать идентификаторы брендов отдельно.
$productBrands = Brand::where('products.title', 'like', '%' . $searchTerm . '%')
->join("products", "brands.brand_id", "=", "products.brand_id")
->get();
Других решений пока нет …