chocofamilyme / phalcon-query-builder-filters
用于处理查询构建器过滤的Phalcon包
1.0.0
2021-06-15 04:52 UTC
Requires
- php: >= 7.0.0
- ext-phalcon: >= 3.0.0
- chocofamilyme/restapi-helpers: 2.*
This package is auto-updated.
Last update: 2024-09-15 11:58:44 UTC
README
用于通过Query Builder框架动态过滤数据的库
安装
使用Composer
$ composer require chocofamilyme/phalcon-query-builder-filters
使用
- 需要创建一个继承自抽象类
Chocofamily\QueryBuilderFilters\BaseFilter
的过滤器类
然后你需要定义过滤器的逻辑,遵循以下规则
- 没有对应过滤方法的查询字符串将被忽略
- 空字符串将被忽略
- 所有键默认转换为camelCase
- 每个查询键的值将被注入到对应的过滤方法中。
- 你可以通过使用
$this->builder
来访问Builder实例 (Phalcon\Mvc\Model\Query\Builder
)
示例:
为了根据以下URL请求过滤数据
http://yourdomain.com/api/users?gender=male&working=1
我们需要编写以下方法
namespace RestAPI\Models\Filters; use Chocofamily\QueryBuilderFilters\BaseFilter; class UserFilter extends BaseFilter { public function gender($value) { return $this->builder->andWhere('RestAPI\Models\User.gender = :gender:', [ 'gender' => $value ]); } public function working($value) { return $this->builder->andWhere('RestAPI\Models\Profile.is_working = :isWorking:', [ 'isWorking' => $value ]); } }
2. 在Phalcon模型中,需要添加实现接口 Chocofamily\QueryBuilderFilters\Contracts\HasFilters
并实现方法 getFilterClass
namespace RestAPI\Models; use Chocofamily\QueryBuilderFilters\Contracts\HasFilters; use RestAPI\Models\Filters\UserFilter; use Phalcon\Mvc\Model; class User extends Model implements HasFilters { /** * @return string */ public function getFilterClass(): string { return UserFilter::class; } }
3. 现在,我们可以使用过滤功能
public function getFilteredUsers() { $filterHandler = new FilterHandler(); $filters = [ 'is_working' => true, 'gender' => 1, 'not_exist_column' => 'test' // так как такого метода у нас нету, этот фильтр проигнорируется ]; $builder = $this->modelsManager->createBuilder() ->columns( [ 'RestAPI\Models\User.id', 'RestAPI\Models\User.name', 'RestAPI\Models\User.gender', 'RestAPI\Models\Profile.is_working', 'RestAPI\Models\Profile.is_active' ] ) ->from('RestAPI\Models\User') ->innerJoin('RestAPI\Models\Profile', 'RestAPI\Models\User.id = RestAPI\Models\Profile.user_id') ->orderBy('is_active DESC'); $filteredBuilder = $filterHandler->handle($builder, $filters); return $filteredBuilder->getQuery()->execute(); }
4. 为了方便,还可以在DI中添加过滤器处理器
use Chocofamily\QueryBuilderFilters\FilterHandler; $di = \Phalcon\Di::getDefault(); $di->set('query-builder-filter', function () use ($di) { return new FilterHandler(); });
待办事项
- 为请求添加别名
- 对代码进行单元测试覆盖
- 编写文档