我怎样才能使搜索是由多个输入过滤在Laravel 4.2


How can I make a search that is filtered by multiple inputs in Laravel 4.2?

我想要这个表单搜索多个字段。如何聚合这些搜索词并按相应字段对其进行过滤?

例如,如果用户在textsearch字段中输入"Book",然后从状态下拉框中选择"Assigned",页面应该返回所有在主题或详细信息字段中包含"Book",在状态字段中包含"Assigned"的请求。

我有以下形式在我的Laravel 4.2应用程序:

    {{ Form::open(['route' => 'requests.search']) }}
    <!-- Text Search Form Input -->
    <div class="form-group">
        {{ Form::label('textsearch', 'Text Search:') }}
        {{ Form::text('textsearch', $query, ['class' => 'form-control']) }}
        {{ Form::hidden('search', 'text') }}
    </div>
    <!-- Status Form Input -->
    <div class="form-group">
    {{ Form::label('status', 'Status:') }}
    {{ Form::select('status', $statuses, null, ['class' => 'form-control']) }}
    </div>
    <!-- Category Form Input -->
    <div class="form-group">
    {{ Form::label('category', 'Category:') }}
    {{ Form::select('category', $categories, null, ['class' => 'form-control']) }}
    </div>
    <!-- Teamleader Form Input -->
    <div class="form-group">
    {{ Form::label('teamleader', 'Team Leader:') }}
    {{ Form::select('teamleader', $projectmembers, null, ['class' => 'form-control']) }}
    </div>
    <!-- Requestid Form Input -->
    <div class="form-group">
    {{ Form::label('requestid', 'Request ID:') }}<br/>
    <span>Between:</span>
    {{ Form::text('requestidstart', null, ['class' => 'form-control', 'style' => 'width:100%;']) }}
    <span>And:</span>
    {{ Form::text('requestidend', null, ['class' => 'form-control', 'style' => 'width:100%;'])}}
    </div>
    <!-- Requestdate Form Input -->
    <div class="form-group">
    {{ Form::label('requestdate', 'Request Date:') }}<br/>
    <span>From:</span>
    {{ Form::text('requestdatestart', null, ['class' => 'form-control etadatepicker', 'style' => 'width:100%;']) }}
    <span>To:</span>
    {{ Form::text('requestdateend', null, ['class' => 'form-control etadatepicker', 'style' => 'width:100%;'])}}
    </div>
    <!-- Requestduedate Form Input -->
    <div class="form-group">
    {{ Form::label('requestduedate', 'Due Date:') }}<br/>
    <span>From:</span>
    {{ Form::text('requestduedatestart', null, ['class' => 'form-control etadatepicker', 'style' => 'width:100%;']) }}
    <span>To:</span>
    {{ Form::text('requestduedateend', null, ['class' => 'form-control etadatepicker', 'style' => 'width:100%;'])}}
    </div>
    {{ Form::submit('Search') }}
    {{ Form::close() }}<br/>

控制器:

$requestresponsetype = ['' => ''] + RequestResponseType::lists('description', 'description');
$projectmembers = ['' => ''] + RequestProjectMember::lists('first_name', 'first_name');
$statuses = ['' => ''] + RequestStatus::lists('description', 'description');
$categories = ['' => ''] + RequestCategory::lists('description', 'description');
$query = Input::get('textsearch');
$requests = DataRequest::where("subject", "LIKE", "%$query%")->orWhere("details", "LIKE", "%$query%")->orWhere("id","LIKE","%$query%")->paginate(10);
return View::make('requests.index', ['requests' => $requests, 'statuses' => $statuses, 'requestresponsetype' => $requestresponsetype, 'projectmembers' => $projectmembers, 'categories' => $categories, 'query' => $query]);

我不太明白你的意思,但我猜大概是这样的:

$requests = DataRequest::where(function($q) {
    $q->where("subject", "LIKE", "%$query%")
      ->orWhere("details", "LIKE", "%$query%")
      ->orWhere("id","LIKE","%$query%");
})
->where('status', '=', $status)
->paginate(10);

在我的项目中,我创建了一个范围来搜索,它是可重用的和可读的。

//BaseModel
public function scopeSearch($query, $search, $fields)
{
    $query->where(function($q) use ($search, $fields) {
        foreach ($fields as $field) {
            $q->orWhere($field, "LIKE", "%$search%");
        }
    }
}
$requests = DataRequest::search($query, ["subject", "details", "id"])
->where('status', '=', $status)
->paginate(10);