2017-05-09 14 views
1

Laravelクエリを製品リストに最適化したい。私はブランドだけでなく、商品リストを表示する必要があります。以下はコードですLaravel 5.4 Eloquent Query Optimization

また、検索で返された商品のすべてのブランドのリストが必要です。

方法1:

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

問題は、これが唯一の理由は製品の10件のレコードのブランドを取得しますです、アレイ内のすべてのブランドのIDを取得し、ページ区切り

$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.'%');}); 

現在、サブクエリメソッドを使用して結果を取得していますが、同じ検索クエリが複数回実行されるため最適化されていないと思います。

お勧めします。

ありがとうございました。

+0

問題はワイルドカードであり、あなたはインデックスを使用することができなくなりますので、 'LIKE「%テキスト%を」'使用するクエリを最適化することはできませんので、あなたが最初のワイルドカードを削除する必要がありますこのクエリを高速化するために。 – FMashiro

+0

'FULLTEXT'インデックスの使用を検討してください。 –

答えて

1

ページネーションはリミットとオフセットのベースで動作しているため、ブランド全体を取得するには2番目のクエリを作成する必要があります。方法1では、商品のブランドを取得するために、以下のようにクエリを変更することができますので、ブランドIDを個別に取得する必要はありません。

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