实施项目过滤功能的最佳方法是什么?
我有一个包含一些项目的表格,每个项目都有一些字段。
如何使用Laravel 5和Eloquent选择带有字段过滤功能的项目,例如电子商务过滤?
答案 0 :(得分:4)
我总是使用雄辩的范围来过滤雄辩的结果: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() !!}
在您的范围中,您可以在限制查询结果之前检查给定值是否为null。这有效地允许用户搜索和过滤分页结果。
您可以使用Laravel Form Requests通过自动验证进一步增强搜索功能,这样您就可以确保他们搜索的输入与查询的数据类型相匹配。以下是使用上述示例的示例:
class ItemSearchRequest extends FormRequest
{
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'nullable|string|min:2|max:100',
'price' => 'nullable|numeric',
];
}
}
答案 1 :(得分:2)
我在这里写了一个包:https://github.com/Tucker-Eric/EloquentFilter
它允许您执行以下操作:
use App\Item;
class ItemController extends Controller
{
public function index(Request $request)
{
$items = Item::filter($request->all())->paginateFilter(25);
return view('items.index', compact('items'));
}
}
答案 2 :(得分:0)
您可以将软件包用于常规索引工作流程,以进行过滤,排序,搜索和分页 https://packagist.org/packages/abyss403/request-meta
class UserController extends Controller
{
...
public function index(Request $request){
// Define model
$model = new User();
// Obtain collection based on request metadata
$collection = \RequestMeta::load($model, $request)->data();
// And just return it
return $collection;
// OR using resources
return new UserResourceCollection($collection);
}
...
}
就这样
答案 3 :(得分:0)
您可以使用这个很棒的laravel软件包: github.com/abdrzakoxa/laravel-eloquent-filter
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index(Request $request)
{
$users = Item::filter($request->all())->paginateFilter(10);
return view('users.index', compact('users'));
}
}