2017-02-04 3 views
1

3つのパラメータを持つ検索フォームを作成して、検索して結果を返します。すべてのパラメータまたはフォームのフォームフィールドはドロップダウンです。複数のパラメータを取ることができる検索フォームから1つのパラメータを使用して検索Laravel

フォームコード:

{!!Form::open(['route' => 'search','class' => 'form-inline pull-left', 'id' => 'search-form', 'method' => 'GET', 'role' => 'search'])!!} 
    <select class=" form-control" name="country"> 
     <option> Select Country</option> 
     @foreach($countries as $country) 
     <option value="{{$country->name}}">{{ucfirst($country->name)}}</option> 
     @endforeach 
    </select> 
    <select class=" form-control" name="category"> 
     <option value="">Select Activity</option> 
     @foreach($categories as $category) 
     <option value="{{$category->name}}">{{ucfirst($category->name)}}</option> 
     @endforeach 
    </select> 
    <select class=" form-control" name="days"> 
     <option value="">Select Duration (Days)</option> 
     <option value="1|5">1-5</option> 
     <option value="10|15">10-15</option> 
     <option value="20|30">20-30</option> 
     <option value="30|60">30-Above</option> 
    </select> 
{{ Form::submit('Search', ['class' => 'btn btn-primary btn-lg','id' => 'search'])}} 

    {!! Form::close() !!} 

つのパラメータでのみ検索するためのコントローラで私の方法:

public function search(Request $request) 
{ 
    $days = $request->days; 
    $days_explode = explode('|', $days); 

    if (isset($request->country) && !isset($request->category) && !isset($request->days)) { 

     $query= Tour::whereHas('country', function($r) use($request) { 
      $r->where('name','=', $request->country); 
     }) 
     ->paginate(8); 

     return view('public.tour.list')->withResults($query); 
    } 
    else{ 
    $query= Tour::whereHas('country', function($r) use($request) { 
      $r->where('countries.name','=', $request->country); 
     }) 
     ->whereHas('category', function($s) use($request) { 
      $s->where('categories.name','=', $request->category); 
     }) 
     ->whereHas('country', function($r) use($request) { 
      $r->where('countries.name','=', $request->country); 
     }) 
     ->whereBetween('days', [$days_explode[0], $days_explode[1]]) 
     ->paginate(8); 
    return view('public.tour.list')->withResults($query); 
    } 

私は私のフォームを柔軟にしようとしています。 1,2または3のパラメータが渡された場合でも結果を返すはずです。このコードでは、3つのパラメータすべてが渡された場合にフォームから結果が返されます。 1つのパラメータだけが渡された場合は、エラーUndefined offset: 1が返されます。

答えて

1

すべてのパラメータを最初に確認してから、クエリに追加するかどうかを決定できます。

$query = Tour::where(function($q) use($request) { 
    if (!empty($request->country)) { 
     $q->whereHas('country', function($r) use($request) { 
      $r->where('countries.name', $request->country); 
     }); 
    } 

    if (!empty($request->category)) { 
     $q->whereHas('category', function($r) use($request) { 
      $r->where('categories.name', $request->category); 
     }); 
    } 
}) 
->whereBetween('days', [$days_explode[0], $days_explode[1]]) 
->paginate(8); 

それとも、この行うことができます:あなたが書かれた上記のコードでは

$query = Tour::query(); 

if (!empty($request->country)) { 
    $query = $query->whereHas('country', function($r) use($request) { 
     $r->where('countries.name', $request->country); 
    }); 
} 

if (!empty($request->category)) { 
    $query = $query->whereHas('category', function($s) use($request) { 
     $s->where('categories.name', $request->category); 
    }); 
} 

$query = $query->whereBetween('days', [$days_explode[0], $days_explode[1]]) 
       ->paginate(8); 
+0

をこのような何かを。パラメータ[日]はフォームの右側で選択する必要がありますか? –

+0

私は依存ドロップダウンリストを使うべきだと思います:D –

+0

@ZacharyDaleこのパラメータまたは他のパラメータをオプションにしたい場合は、 'if'節に入れてください。 –

関連する問題