hashemi / queryfilter
一个简单且动态的Laravel查询包。它可以帮助你为每个参数编写单独的查询逻辑。
Requires
- php: >=7.1
- illuminate/console: >=6.0
- illuminate/database: >=6.0
- illuminate/http: >=6.0
- illuminate/support: >=6.0
Requires (Dev)
- phpunit/phpunit: ^8.4|^9.0
This package is auto-updated.
Last update: 2024-09-08 11:48:27 UTC
README
一个简单且动态的Laravel查询包。它可以帮助你为每个参数编写单独的查询逻辑。
安装
您可以从composer开始。转到您的终端,然后在项目根目录中运行此命令。
composer require hashemi/queryfilter
- 如果您使用Laravel,则Laravel将自动发现该包。如果它没有发现该包,请在您的
config/app.php
的providers
数组中添加以下提供者。
Hashemi\QueryFilter\QueryFilterServiceProvider::class
- 如果您使用Lumen,则必须在您的
bootstrap/app.php
文件中添加以下片段。
$app->register(Hashemi\QueryFilter\QueryFilterServiceProvider::class)
用法
假设您想在User
模型上使用查询过滤器进行查询。Laravel QueryFilter提供Filterable
特质。您需要在您的模型上使用它。它将为您的模型添加一个filter
范围。例如,
class User extends Model { // Use Filterable Trait // .... use \Hashemi\QueryFilter\Filterable; // .... }
现在,您需要创建您的查询过滤器文件,在其中您将编写通过传递参数生成SQL的SQL逻辑。您可以通过以下命令创建您的过滤器文件,
php artisan make:filter UserFilter
此命令将在您的app/
目录中创建Filters
目录。因此,您可以在app/Filters/UserFilter.php
中找到该文件。过滤器类的每个方法都代表您传递的参数键。您需要传递您的参数并使用snake小写,并且您的方法名称将是apply<ParameterName>Property
格式。属性名称必须以Pascal大小写编写。
class UserFilter extends \Hashemi\QueryFilter\QueryFilter { public function applyIdProperty($id) { return $this->builder->where('id', '=', $id); } public function applyNameProperty($name) { return $this->builder->where('name', 'LIKE', "%$name%"); } }
创建该文件后,当您在控制器中使用模型进行查询时,您需要使用您的范围并传递UserFilter
类作为参数。您的控制器看起来将如下所示,
class UserController extends Controller { public function index(Request $request, UserFilter $filter) { $user = User::query()->filter($filter)->get(); // do whatever } }
如果您想在过滤器中传递自定义查询,您也可以在您的过滤器中这样做,
class UserController extends Controller { public function index(Request $request, UserFilter $filter) { $user = User::query()->filter($filter, [ 'username' => 'ssi-anik' ])->get(); // do whatever } }
并且在您的app/Filters/UserFilter.php
文件中,您可以这样做,
class UserFilter extends \Hashemi\QueryFilter\QueryFilter { public function applyIdProperty($id) { return $this->builder->where('id', '=', $id); } public function applyNameProperty($name) { return $this->builder->where('name', 'LIKE', "%$name%"); } public function applyUsernameProperty($username) { return $this->builder->where('username', 'LIKE', "%$username%"); } }
就是这样。
约定
- 您的
*Filter
类应该具有apply*Property
格式的函数。其中*
将被StudlyCase属性名称替换。因此,如果您的字段名称是first_name
,则方法名称应该是applyFirstNameProperty()
。 - 如果您向模型的过滤器范围传递了额外的数据,如
Model::filter($filter, ['id' => 4])
,则提供的数组将覆盖请求的数据。
注意事项
如果您的request
和传递给filter
范围的provided array
找不到任何合适的方法,那么它将返回整个表数据,如下所示:select * from your_table
。请注意此问题。
贡献
欢迎拉取请求。对于任何更改,请首先打开一个问题来讨论您想要更改的内容。