2016-08-05 9 views
0

車のテーブルがあります。私の車両の検索ページでは、モデル、色などを選択して車両をフィルタリングします。Laravel 5のテーブルに複数のフィルタを適用する

私のコードでは、車両モデルをインスタンス化しようとしました。その後、フィルタを適用し、get()を使用してクエリを実行しようとしましたが、エラーが表示されました。ここ

コード:私は直接、自動車のような車両モデルにwhereHasを使用する場合:: whereHasをここで

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

単一のフィルタが動作します()。条件に基づいて複数のフィルタを適用しなければならない場合の解決策は何ですか。 誰が私の日を救うのですか?

答えて

2

をですから、基本的に行うために必要となるすべてはあなたのフィルタを持っている$conditions配列を持つことである、のような:

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

これはあなたのからのみkey => valueペアを含むcollectionを行います(おそらくいくつかのフォームから?)と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を使用してフィルタリングできるモデルテーブルにありますが、車両テーブルに色があります。入力がある場合は、これらをベースにして適用する必要があります。到着する入力に基づいて複数の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 Thatsは問題ありません。既存のパラメータに基づいて配列を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は答えの高度なバージョンを持っています。 :) –

関連する問題