【问题标题】:Search with one parameter from search form that can take multiple parameter Laravel使用搜索表单中的一个参数搜索,可以采用多个参数 Laravel
【发布时间】:2017-02-04 21:05:10
【问题描述】:

我创建了一个搜索表单,它可以有 3 个参数来搜索数据库并返回结果。表单中的所有参数或表单字段都是下拉列表。

表格代码:

{!!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 个参数都传递给它,则表单将返回结果。如果只传递一个参数,则会报错Undefined offset: 1

【问题讨论】:

    标签: php laravel laravel-5.3 blade


    【解决方案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);
    

    【讨论】:

    • 在上面你写的代码中。参数 [days] 必须在表单中选择对吗?
    • 我想我应该使用依赖下拉列表:D
    • @ZacharyDale 如果您想将此参数或任何其他参数设为可选参数,请将其放入if 子句中。
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2013-03-16
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多