2017-10-07 24 views
0

私は以下のコントローラを持っています。私は、ajaxを介してくる変数に基づいてクエリを実行します。今私の質問は、変数をチェックし、ステートメントの行だけを呼び出す場所を動的にすることができるかどうかをすべてチェックせずに、より効率的な手段にする方法です。コントローラ内の動的引数ベースの関数呼び出し

例: $ category_idが& $ min_priceしかないので、クエリの実行速度が向上し、コントローラ内にno_of_statementsも保存できるように、その文の行だけが実行されるとします。

public function searchByCheckbox(Request $request) 
    { 
     if(!empty($request->get('category_id'))|| 
      !empty($request->get('industry_id')) || 
      !empty($request->get('min_price'))  || 
      !empty($request->get('max_price')) 
     ) 
     {     

     $query = DB::table('users') 
      ->join('products','products.auth_id','users.id') 
      ->Join('reviews','products.id','reviews.product_id') 
      ->select('products.*','users.avatar',DB::raw('(sum(rating)/count(user_id)) as rating'))    
      ->where('products.status','=','1')   
      ->groupBy('products.id') 
      ->latest(); 

     if ($request->has('category_id')) { 
      $query->WhereIn('products.category_id', $request->get('category_id')); 
     } 

     if ($request->has('industry_id')) { 
      $query->WhereIn('products.industry_id', $request->get('industry_id')); 
     } 

     if ($request->get('min_price')!='0') { 
      $query->Where('products.regular_price','>' ,$request->get('min_price')); 
     } 

     if ($request->get('max_price')!='0') { 
      $query->Where('products.regular_price','<' ,$request->get('max_price')); 
     } 


     if($request->has('min_price') && $request->has('max_price')){ 
      $query->whereBetween('products.regular_price', 
      [ $request->get('min_price'), 
       $request->get('max_price') 
      ]); 
     } 

     if ($request->has('industry_id')&& $request->has('category_id')) 
     { 
      $query->orWhereIn('products.industry_id', $request->get('industry_id')); 
      $query->orWhereIn('products.category_id', $request->get('category_id')); 
     } 

     if ($request->has('industry_id')&& $request->has('category_id') && $request->get('min_price')!='0' && $request->get('max_price')!='0') 
     { 
      $query->orWhereIn('products.industry_id', $request->get('industry_id')); 
      $query->orWhereIn('products.category_id', $request->get('category_id')); 
      $query->orwhereBetween('products.regular_price', 
      [ $request->get('min_price'), 
       $request->get('max_price') 
      ]); 
     } 

     $products = $query->get(); 


     } 
     else 
     { 


     $products = DB::table('users') 
      ->join('products','products.auth_id','users.id') 
      ->Join('reviews','products.id','reviews.product_id') 
      ->select('products.*','users.avatar',DB::raw('(sum(rating)/count(user_id)) as rating'))      
      ->where('products.status','=','1') 
      ->groupBy('products.id')   
     ->latest() 
     ->get(); 
     } 

     return view('cart.ajax.product-result', ['products' => $products]); 
    } 

答えて

0

私はダイナミックチェックは不必要な複雑さを追加すると考えています。私はちょうどいくつかの変更を加えるだろう

  1. あなたの要求(もしあれば)の中に他のデータとフィルターデータを分けてください。フィルタフィールドの名前はfilter['min_price']のようにする必要があります。
  2. 最後の2つのif文は意味をなさないため、削除します。

私はこのようにそれを行うだろう:

public function searchByCheckbox(Request $request) 
{ 
    $filter = $request->has('filter')?$request->get('filter'):[]; 
    $products = []; 
    $query = DB::table('users') 
     ->join('products','products.auth_id','users.id') 
     ->Join('reviews','products.id','reviews.product_id') 
     ->select('products.*','users.avatar',DB::raw('(sum(rating)/count(user_id)) as rating')) 
     ->where('products.status','=','1') 
     ->groupBy('products.id') 
     ->latest(); 

    if(empty($filter)){ 
     $products = $query->get(); 
    }else{ 
     if(empty($filter['min_price'])){ 
      $filter['min_price'] = 0; 
     } 

     if(!empty($filter['category_id'])){ 
      $query->WhereIn('products.category_id', $filter['category_id']); 
     } 

     if(!empty($filter['industry_id'])){ 
      $query->WhereIn('products.industry_id', $filter['industry_id']); 
     } 

     if(!empty($filter['max_price'])){ 
      $query->whereBetween('products.regular_price', 
       [ $filter['min_price'], 
        $filter['max_price'] 
       ]); 
     }else{ 
      $query->Where('products.regular_price','>', $filter['min_price']); 
     } 
    } 
    return view('cart.ajax.product-result', ['products' => $products]); 
} 
関連する問題