po4e4ka-lib/symfony-filter

symfony orm的postgresql过滤器

dev-main 2023-06-27 10:26 UTC

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,它是一个三倍的数组,其中每个三元组包含

  1. 过滤字段
  2. 运算符

有效请求示例

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 ...

支持的运算符: ><=<=>=~<>!=isis_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();
        }

...