infinitypaul / laravel-database-filter
需要通过查询字符串过滤数据库结果?这是一个美丽且易于扩展的 Laravel 包,可以保持你的代码非常整洁。
Requires
- php: ^7.4|^8.0
- illuminate/contracts: ^7.0|^8.0|^9.0|^10.0|^11.1
Requires (Dev)
- orchestra/testbench: ^5.0|^6.0|^7.1.0|^8.0|^9.0
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-09-20 20:46:49 UTC
README
你是否曾经遇到过用大量 GET 参数过滤数据库表的问题?我只能想象你的代码会有多臃肿。放松一下,解决这个问题的最简单方案就在这里。假设我们需要用以下 GET 参数查询我们的记录表
安装
您可以通过 composer 安装此包
composer require infinitypaul/laravel-database-filter
包将自动注册自身,但如果您的 Laravel 版本小于 5.5,您需要在 config/app.php 文件中添加 Infinitypaul\LaravelDatabaseFilter\LaravelDatabaseFilterServiceProvider::class 服务提供者。
使用
一旦安装了包,您就可以使用 artisan 命令。
php artisan make:filter
我们将处理以下记录表
过滤操作将在 6 个简单步骤中完成。太完美了!让我们开始吧
* 第 1 步
创建一个父级过滤器类,所有过滤器都会记录在这里。这可以通过以下一行代码创建
php artisan make:filter RecordFilter --model
此包将在 app/Filters 文件夹下生成一个新的 PHP 文件 RecordFilter.php。这是创建其他过滤器的地方。它看起来像这样
<?php namespace App\Filters; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FiltersAbstract; class RecordFilter extends FiltersAbstract { protected $filters = []; }
* 第 2 步
由于我们正在处理记录表,我们将处理 Record 模型。所以打开你的 Record 模型,并包含以下内容:* Filter 特性 * Record Filter 类
namespace App; use App\Filters\RecordFilter; use Infinitypaul\LaravelDatabaseFilter\Traits\filterTrait; class Course extends Model { use filterTrait; protected $filter = RecordFilter::class; //mother filter class }
* 第 3 步
我们将使用 3 个参数进行过滤(dept,level,grade)
为每个过滤器创建过滤器类
php artisan make:filter DeptFilter php artisan make:filter LevelFilter php artisan make:filter GradeFilter
上述命令还会在 app/Filters 文件夹下生成新的 PHP 文件,名为 DebtFilter.php,LevelFilter.php 和 GradeFilter.php,如下所示。
namespace App\Filters; use Illuminate\Database\Eloquent\Builder; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FilterAbstract; class DebtFilter extends FilterAbstract { public function mappings () { return []; } public function filter(Builder $builder, $value) { return $builder; } }
做得好!!!让我们进入下一步
* 第 4 步
现在我们在每个类中编写我们的逻辑
在我们的 DeptFilter 类中,我们编写以下内容
namespace App\Filters; use Illuminate\Database\Eloquent\Builder; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FilterAbstract; class DeptFilter extends FilterAbstract { public function mappings () { return []; } public function filter(Builder $builder, $value) { return $builder->where('dept', $value); } }
在我们的 LevelFilter 类中,我们编写以下内容
namespace App\Filters; use Illuminate\Database\Eloquent\Builder; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FilterAbstract; class LevelFilter extends FilterAbstract { public function mappings () { return []; } public function filter(Builder $builder, $value) { return $builder->where('level', $value); } }
在我们的 GradeFilter 类中,我们编写以下内容
namespace App\Filters; use Illuminate\Database\Eloquent\Builder; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FilterAbstract; class GradeFilter extends FilterAbstract { public function mappings () { return []; } public function filter(Builder $builder, $value) { return $builder->where('grade', $value); } }
过滤器方法接收我们的条件或与数据库进行比较的任何检查
完成得很好。继续前进!!!
* 第 5 步
我们编写我们的搜索参数与过滤器类的对比。让我们打开我们的父级过滤器类 - RecordFilter,以注册我们生成的所有条件。
namespace App\Filters; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FiltersAbstract; class RecordFilter extends FiltersAbstract { protected $filters = [ 'dept' => DeptFilter::class, 'level' => LevelFilter::class, 'grade' => GradeFilter::class ]; }
$Filter 数组键将是查询参数。
* 第 6 步
假设我们有一个名为 RecordController 的控制器,我们可以创建一个函数来获取我们的记录
namespace App\Http\Controllers; use App\Course; use App\Filters\AccessFilter; use Illuminate\Http\Request; class RecordController extends Controller { public function index(Request $request){ return Course::filter($request)->get(); } }
我们完成了所有工作!!!
当我们在浏览器中输入以下内容时
我们将得到以下结果
{
"data": [
{
"id": 5,
"department": "csc",
"level": 200,
"score": "80",
"grade": "a"
}
]
}
调整时间
为了严格查询参数输入,我们可以使用映射方法或留空以允许自由输入。
假设我们返回数据时,希望所有部门都返回为 CSC。我们将返回值映射到 DeptFilter 类的 mappings 函数中,如下所示
namespace App\Filters; use Illuminate\Database\Eloquent\Builder; use Infinitypaul\LaravelDatabaseFilter\Abstracts\FilterAbstract; class DeptFilter extends FilterAbstract { public function mappings () { return [ 'csc' => 'CSC' ]; } public function filter(Builder $builder, $value) { return $builder->where('dept', $value); }
以上设置下,一旦在查询参数中输入 csc,它将返回 CSC 作为值。
最后,您可以通过传递一个过滤器数组到过滤器作用域来添加本地作用域过滤器。
public function index(Request $request){ return Record::filter($request, ['score' => DifficultyFilter::class])->get(); }
您还可以以这种方式从控制器中覆盖您的过滤器属性
public function course(Request $request){ return Record::filter($request, PaulFilter::class, ['score' => DifficultyFilter::class])->get(); }
因此,您可以使用RecordFilter代替过滤器,它将使用PaulFilter
错误 & 功能
如果您发现了任何错误,或者想要从库中请求额外的功能,请通过项目的Github页面上的Issue Tracker提交问题:[https://github.com/infinitypaul/laravel-database-filter/issues](https://github.com/infinitypaul/laravel-database-filter/issues)。
贡献
请参阅CONTRIBUTING以获取详细信息。
安全性
如果您发现了任何安全相关的问题,请通过电子邮件infinitypaul@live.com提交,而不是使用问题跟踪器。
如何感谢您呢?
为什么不给github仓库点个star呢?我很期待关注!为什么不将这个仓库的链接分享到Twitter或HackerNews上?传播一下!
别忘了在Twitter上关注我!
谢谢!Edward Paul。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。