减少类似的查询

时间:2016-09-02 12:58:01

标签: php laravel laravel-5.2

我有四个类似的查询:

        $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

但出于不同的目的。

  1. 获取所有类别的产品。
  2. 获得10件产品
  3. 获取一个包含类别,用户和品牌的产品
  4. 获得包含类别,用户和品牌的20种产品
  5. 如何减少查询?

3 个答案:

答案 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