2016-08-05 65 views
0

我有一個車輛表。在我的車輛搜索頁面中,我會根據所選車型,顏色等對車輛進行過濾。將多個過濾器應用於Laravel 5的表格

在我的代碼中,我嘗試實例化車輛模型。然後將過濾器應用到它並嘗試使用get()運行查詢,但給我提供了錯誤。

代碼在這裏:

$vehicles = Vehicle::all(); 
    if($request->input('model')) 
    { 
     $vehicles->whereHas('model', function($q) 
     { 
      $q->where('model_name', '=', 'CL'); 

     }); 

    } 
    if($request->input('color')) 
    { 
     $vehicles->where('color', '=', 'red'); 
    } 
    // other filters here 
    $result = $vehicles->get(); 
    dd($result); 

這裏只舉一個過濾器的工作原理,如果我直接在樣車車型使用whereHas :: whereHas()。如果我必須根據條件應用多個過濾器,那麼解決方案是什麼? 誰節省了我的一天:)

回答

2

因此,所有你需要做的基本上是有一個$conditions陣列上,您的過濾器,如:

$conditions = collect([]); 
$conditions->push($request->only(['model_name', 'color', 'year', 'valueMin', 'valueMax']')); 

這將使collection只包含從的key => value雙種valueMax性(也許從某種形式?)

然後,你只需在傳遞集合查詢,像這樣:

Vehicle::where(function($q) use ($conditions){ 
    if ($conditions->has('color')) { 
     $q->where('color', $conditions->get('color')); 
    } 

    return $q; 
})->whereHas('model', function($q) use ($conditions) { 
    return $q->where($conditions->toArray()); 
})->get(); 

這樣你就不需要擔心硬編碼你在查詢中的條件,你可以有一個永無止境的限制。進行直接比較時,您只需傳入包含鍵值對的數組即可。

此解決方案將允許您查找的動態屬性比較。

+0

模型名稱在模型表中,可以使用wherehas過濾,但顏色在車輛表中。我需要應用這些基於如果輸入存在。根據到達的輸入,可能有多個地方也適用。 –

+0

@mirzavu更新後支持在父表上進一步進行'where'過濾,並在相關表上允許'whereHas'。 – Ohgodwhy

+0

該查詢現在可以正常工作了,並且我建議對收集進行編輯以使其正常工作!請接受編輯並將其標記爲ans。非常感謝 –

0

我不認爲$vehicles = Vehicle::all();是先加載數據並應用過濾器的最好方法。這可能會影響大量記錄的性能,因爲您正在加載表中的所有數據,包括不必要的記錄。

嘗試以下多個條件:

$vehicles = Vehicle::where(['model_name'=>'CL','color'=>'red'])->get(); //color is just an assumption. This way you can use multiple conditions. 
dd($vehicles); 

我希望這有助於東西..

+0

這裏的問題是,它假定總是會有一個型號名稱,總是會有一種顏色。沒有時會發生什麼? – Ohgodwhy

+0

在這種情況下,如果條件中存在很多if和else,我們可以使用'QueryBuilder'。 – jonju

+0

@Ohgodwhy這很好,我們可以根據現有參數創建數組到where()中。但是,只有當model_name和color是車輛表的列時,這才起作用。如果model_name在表格模型和表格車輛的顏色中,該怎麼辦? –

1

試試這個:

$vehicles = new Vehicle(); 
     if($request->input('model')) 
     { 
      $vehicles = $vehicles->whereHas('model', function($q) 
      { 
       $q->where('model_name', '=', 'CL'); 

      }); 

     } 
     if($request->input('color')) 
     { 
      $vehicles = $vehicles->where('color', '=', 'red'); 
     } 
     // other filters here 
     $result = $vehicles->get(); 
     dd($result); 
+0

這工作!但@Ohgodwhy有一個高級版本的答案。 :) –