我一直使用 eloquent 作用域来过滤 eloquent 结果:https://laravel.com/docs/5.1/eloquent#query-scopes
您的控制者:
use App\Item;
class ItemController extends Controller
{
public function index(Request $request)
{
$items = Item::name($request->name)->price($request->price)->paginate(25);
return view('items.index', compact('items'));
}
}
您的模型:
class Item extends Model
{
public function scopeName($query, $name)
{
if (!is_null($name)) {
return $query->where('name', 'like', '%'.$name.'%');
}
return $query;
}
public function scopePrice($query, $price)
{
if (!is_null($price)) {
return $query->where(compact('price'));
}
return $query;
}
}
您的看法:
<form action="{{ route('items.index') }}" method="get">
<input type="text" name="price" />
<input type="text" name="name" />
<input type="submit" value="Search">
</form>
@foreach($items as $item)
{{ $item->name }}
@endforeach
{!! $items->render() !!}
在您的范围内,您可以在限制查询结果之前检查给定值是否为空。这有效地允许用户搜索和过滤分页结果。
您可以通过使用 Laravel 的 Form Requests 进行自动验证来进一步增强搜索,这样您就可以确保他们正在搜索的输入与您的查询的数据类型相匹配。
请记住,您必须修改 getRedirectUrl() 方法,因为您的用户将执行 GET 请求,并且默认情况下,getRedirectUrl() 将包含 GET URL 参数,从而导致无限循环,因为其中一个参数验证失败。
下面是一个使用上面的例子:
class ItemSearchRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'nullable|string|min:2|max:100',
'price' => 'nullable|numeric',
];
}
protected function getRedirectUrl()
{
return url('/items');
}
}