我有四个类似的查询:
$products=Product::orderBy('views','desc')->with('category')->get(); //----1
$mostviews=Product::orderBy('views','desc')->limit(10)->get(); //----2
$show=Product::orderBy('views','desc')->with('category')
->with('user')
->with('productbrand.brand')
->first(); //----3
$shows=Product::orderBy('views','desc')->limit(20)
->with('category')
->with('user')
->with('productbrand.brand')
->get(); //----4
但出于不同的目的。
如何减少查询?
答案 0 :(得分:1)
你可以试试,
$po= Product::orderBy('views','desc');
$products=$po->with('category')->get(); //---1
$mostviews=$po->limit(10)->get(); //---2
$shows=$po->limit(20)
->with('category')
->with('user')
->with('productbrand.brand')
->get();
$show=$shows[0]; //----3
答案 1 :(得分:1)
在您的控制器中
$products = Product::orderBy('views','desc')->with(['category','user','productbrand.brand'])->get();
return view('product.list',compact('products'));
在您的视图中
$all = $products;
$mostViews = $products->take(10);
$show = $products->first();
$shows= $products->take(20);
答案 2 :(得分:1)
您无需创建所有这些变量。就这样做:
$products = Product::orderBy('views','desc')
->with('category', 'user', 'productbrand.brand')
->get();
获得数据后,使用此变量。但如果您在DB中有产品说明和/或规格,我还建议您不要使用take()
方法。因为如果你这样做,它可以轻松占用所有内存。事情是每个take()
will create new collection。
您可以使用$products
而无需创建新的集合或变量:
// Show:
{{ $products->first()->id }}
// Most views:
@foreach ($products as $product)
@if ($loop->iteration > 10)
@break
@endif
{{ $product->something }}
@endforeach
// Shows:
@foreach ($products as $product)
@if ($loop->iteration > 20)
@break
@endif
{{ $product->something }}
@endforeach