ayman-els/laravel-filter-package
一个具有自定义过滤特性的Laravel包
v1.0.0
2023-08-15 13:19 UTC
README
轻松根据URL查询字符串参数过滤查询。
与Laravel 5.x 6.x 7.x 8.x 9.x 10.x 兼容.
目录
问题描述
你可能遇到过需要根据URL查询字符串中的参数过滤查询的情况。在开发逻辑后,你可能有这样的代码
$users = User::latest(); if(request('username')) { $users->where('username', request('username')); } if(request('age')) { $users->where('age', '>', request('age')); } if(request('email')) { $users->where('email', request('email')); } return $users->get();
这可以工作,但这不是一个好的实践。
当参数的数量开始增加时,这种if
语句的数量也会增加,你的代码会变得庞大且难以维护。
这也违反了SOLID原则中的开闭原则,因为当你有一个新参数时,你需要进入你的现有代码并添加新的逻辑(这可能会破坏现有的实现)。
因此,我们需要设计一种方法来使我们的过滤器逻辑相互分离,并应用于最终查询,这正是这个包背后的全部思想。
使用方法
- 首先,你需要安装这个包
$ composer require ayman-els/laravel-filter-package
- 然后,你应该在模型中
use
Filter
特性,并定义$filterCols, $filterDates, $filterSearchCols, $filterColsChilds
属性。
use AymanEls\LaravelFilterPackage\Traits\Filter; class Product extends Model { use Filter; public static $filterCols = ['category_id', 'department_id', 'user_id']; public static $filterDates = ['from' => 'created_at', 'to' => 'created_at']; public static $filterSearchCols = ['name_en', 'name_ar', 'description']; public static $filterColsChilds = ['currency' => 'department']; ... }
- 你需要在Eloquent查询中使用
filter()
方法。例如
Product::filter()->get();
假设我们的查询是这样的
?search=field&from=2023-01-01&to=2023-01-02&category_id=1&department_id=1&user_id=1¤cy=1