项目过滤拉拉维雄辩


Items filter laravel eloquent

实现项目过滤器功能的最佳方法是什么?

我有一个包含一些项目的表格,每个项目都有一些字段。

如何使用Laravel 5和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() !!}

在范围中,可以在限制查询结果之前检查给定值是否为 null。这有效地允许用户搜索和过滤分页结果。

您可以通过使用 Laravel 的表单请求进行自动验证来进一步增强搜索,这样您就可以确保他们正在搜索的输入与您的查询的数据类型匹配。

请记住,您必须修改 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');
    }
}

我在这里为此编写了一个包: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'));
    }
}

您可以使用这个很棒的 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'));
    }
}

您可以使用常规索引工作流的包来筛选、排序、搜索和分页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);
    }
    ...
}

就是这样