po4e4ka-lib / symfony-filter
symfony orm的postgresql过滤器
dev-main
2023-06-27 10:26 UTC
Requires
- php: >=8.1.0
- doctrine/orm: ^2.12
- scienta/doctrine-json-functions: ~4.3
Requires (Dev)
- php: >=8.1.0
- doctrine/orm: ^2.12
- scienta/doctrine-json-functions: ~4.3
This package is not auto-updated.
Last update: 2024-09-24 12:11:40 UTC
README
SQL级别的过滤库(仅验证了PostgreSQL)
该扩展允许根据过滤器过滤数据库查询。
特性
- 按表格列名称进行过滤
- 按列别名(as后的名称)进行过滤
- 可以比较两个字段之间的值
- 可以添加limit和offset
- 为PostgreSQL添加了REGEXP函数
- 添加了对JSON键的过滤功能
安装
- 执行命令
php composer require po4e4ka-lib/symfony-filter
更新文件 service.yaml
services:
...
ElsaLib\SymfonyFilter\:
resource: '../vendor/po4e4ka/symfony-filter/src/'
public: true
exclude:
- '../vendor/po4e4ka/symfony-filter/src/RegexDqlPostgresFunction.php'
...
更新文件 doctrine.yaml
doctrine:
orm:
dql:
string_functions:
JSON_GET_TEXT: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Postgresql\JsonGetText
regexp: Po4e4ka\SymfonyFilter\RegexDqlPostgresFunction
使用方法
前端
为了提交过滤器,需要在请求中添加一个queryParam,它是一个三倍的数组,其中每个三元组包含
- 过滤字段
- 运算符
- 值
有效请求示例
https://api.test.test/api/building?limit=40&offset=0&filter[]=address&filter[]=~&filter[]=Руч&filter[]=city&filter[]==&filter[]=2
这里添加了两个过滤器。在数据库中这将是这样的 ... WHERE table_name.address ~ 'Руч' AND table_name.city = 2 ...
支持的运算符: >
、<
、=
、<=
、>=
、~
、<>
、!=
、is
、is_not
。
~
- 在字段中执行子串搜索(regexp)
后端
为了使用过滤器,需要将Filtrate
类注入到自己的Repository类中
use Po4e4ka\SymfonyFilter\Filtrate;
class MyRepository extends ServiceEntityRepository{
private Filtrate $filtrate;
public function __construct(Filtrate $filtrate)
{
$this->filtrate = $filtrate;
}
...
过滤器与已准备好的QueryBuilder对象一起工作。要使用过滤器,您需要在获取结果之前添加它
...
public function getSomeData(int $buildingId, array $filters, ?int $limit, ?int $offset)
{
$qb = $this->createQueryBuilder('my_table_alias')
->where('my_table_alias.building = ' . $buildingId)
->orderBy('my_table_alias.id', 'DESC');
$this->filtrate->filtrate($qb, $filters, $limit, $offset);
return $qb->getQuery()->getResult();
}
...