【问题标题】:Reducing the similar like queries减少类似查询
【发布时间】:2016-09-02 21:50:20
【问题描述】:

我有这四个类似的查询:

        $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个产品的类别、用户和品牌

如何减少查询?

【问题讨论】:

  • 为什么要合并查询?它们都是在同一个方法或操作中调用的吗?
  • @AngadDubey 尽可能减少查询。

标签: php laravel laravel-5.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

【讨论】:

    【解决方案2】:

    你可以试试,

    $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
    

    【讨论】:

      【解决方案3】:

      在你的控制器中

      $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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多