【问题标题】:Items filter laravel eloquent项目过滤 laravel 雄辩
【发布时间】:2016-07-08 17:43:38
【问题描述】:

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

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

如何使用 Laravel 5 和 Eloquent 选择带有字段过滤的项目,例如电子商务过滤?

【问题讨论】:

  • 请考虑在句子结束时使用点,在问题的末尾使用问号,在新短语的开头使用大写。
  • 是的,我的错。道歉。
  • 那么您为什么不编辑您的问题?我现在为你编辑了。
  • 问题太笼统 - 你的目标是什么? “Best”有不同的含义——最快、最易维护、最简单……你尝试过什么,尝试后得到了什么结果?

标签: php laravel eloquent


【解决方案1】:

我在这里为此写了一个包: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】:

    我一直使用 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');
        }
    }
    

    【讨论】:

    • 兄弟,只有当价格和名称的输入字段是数据库的正确输入时才显示结果。,是否可以像 OR 一样过滤,输入可以是名称或价格,就是这样为什么,你能给我一个快速指南
    • @SoulCoder 上面的答案只是一个例子,你可以使用任何你需要的查询逻辑进行过滤。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      就是这样

      【讨论】:

        猜你喜欢
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2013-06-19
        相关资源
        最近更新 更多