kalmanolah/php-query-filters

此软件包已被废弃,不再维护。未建议替代软件包。

通过任意标准简化查询过滤的实用工具。

dev-master 2016-10-10 18:20 UTC

This package is not auto-updated.

Last update: 2023-07-08 12:51:07 UTC


README

php-query-filters 是一个包含工具的库,允许轻松过滤查询。这对于试图创建允许用户根据任意标准过滤数据的 REST API 的人来说非常有用。

目前支持的有

  • 摘要

    • 浮点转换器
    • 整数转换器
  • 基于 Doctrine ORM QueryBuilder 的查询

    • 自动连接
    • GT/GTE 过滤器
    • LT/LTE 过滤器
    • EQ/NE 过滤器
    • NULL/NOT NULL 过滤器
    • LIKE 过滤器
    • OR 过滤器
    • 日期时间转换器
  • 基于 MongoDB 数组的查询

    • GT/GTE 过滤器
    • LT/LTE 过滤器
    • EQ/NE 过滤器
    • NULL/NOT NULL 过滤器
    • LIKE 过滤器(使用 $regex)
    • GEONEAR 过滤器(点 + 半径)
    • OR 过滤器(使用 $or)
    • MongoId 转换器
    • MongoDate 转换器

安装

使用 composer 在您的项目中包含库

$ composer require kalmanolah/php-query-filters

使用

过滤 Doctrine ORM QueryBuilder 查询

use KalmanOlah\QueryFilter\FilterSet;
use KalmanOlah\QueryFilter\Transformer as Transformer;
use KalmanOlah\QueryFilter\Doctrine\ORM\Filter as DoctrineORMFilter;
use KalmanOlah\QueryFilter\Doctrine\ORM\Transformer as DoctrineORMTransformer;

// Initialize the filter set
$filterSet = (new FilterSet())
    // Register filters
    ->registerFilter(new DoctrineORMFilter\EqualsFilter())
    ->registerFilter(new DoctrineORMFilter\NotEqualsFilter())
    ->registerFilter(new DoctrineORMFilter\LikeFilter())
    ->registerFilter(new DoctrineORMFilter\FalseFilter())
    ->registerFilter(new DoctrineORMFilter\TrueFilter())
    ->registerFilter(new DoctrineORMFilter\GreaterThanFilter())
    ->registerFilter(new DoctrineORMFilter\GreaterThanOrEqualToFilter())
    ->registerFilter(new DoctrineORMFilter\LessThanFilter())
    ->registerFilter(new DoctrineORMFilter\LessThanOrEqualToFilter())
    ->registerFilter(new DoctrineORMFilter\NullFilter())
    ->registerFilter(new DoctrineORMFilter\NotNullFilter())
    ->registerFilter(new DoctrineORMFilter\OrFilter())
    // Register transformers
    ->registerTransformer(new Transformer\FloatTransformer())
    ->registerTransformer(new Transformer\IntegerTransformer())
    ->registerTransformer(new DoctrineORMTransformer\DateTimeTransformer());

// Create a query
$qb = $entityManager->createQueryBuilder()
    ->select('u')
    ->from('MyLibrary:User', 'u');

// Get some filters from somewhere (generally your REST API GET params)
// eg: GET /api/users?filter[]=foo,bar&filter[]=bar,baz
$filters = [
    '*,or 1,2,3',                  // Wrap filters with index 1, 2 and 3 in OR statement
    'profile.firstName,eq John',   // LEFT JOIN u.profile p, WHERE p.firstName = 'John'
    'username,like adm',           // WHERE u.username LIKE '%adm%'
    'enabled,true',                // WHERE u.enabled = TRUE
    'lastLogin,gte:dt 2015-03-03', // WHERE u.lastLogin >= '2016-03-03 00:00:00'
    'karma,lt:f 3.6',              // WHERE u.karma < 3.6
];

// Apply filters to the query
$filterSet->applyQueryFilters($qb, $filters);

// Get the query result as you normally would
$result = $qb->getQuery()->getResult();

过滤 MongoDB 数组查询

use KalmanOlah\QueryFilter\FilterSet;
use KalmanOlah\QueryFilter\Transformer as Transformer;
use KalmanOlah\QueryFilter\MongoDB\Filter as MongoDBFilter;
use KalmanOlah\QueryFilter\MongoDB\Transformer as MongoDBTransformer;

// Initialize the filter set
$filterSet = (new FilterSet())
    // Register filters
    ->registerFilter(new MongoDBFilter\EqualsFilter())
    ->registerFilter(new MongoDBFilter\NotEqualsFilter())
    ->registerFilter(new MongoDBFilter\LikeFilter())
    ->registerFilter(new MongoDBFilter\FalseFilter())
    ->registerFilter(new MongoDBFilter\TrueFilter())
    ->registerFilter(new MongoDBFilter\GreaterThanFilter())
    ->registerFilter(new MongoDBFilter\GreaterThanOrEqualToFilter())
    ->registerFilter(new MongoDBFilter\LessThanFilter())
    ->registerFilter(new MongoDBFilter\LessThanOrEqualToFilter())
    ->registerFilter(new MongoDBFilter\NullFilter())
    ->registerFilter(new MongoDBFilter\NotNullFilter())
    ->registerFilter(new MongoDBFilter\GeoNearFilter())
    ->registerFilter(new MongoDBFilter\OrFilter())
    // Register transformers
    ->registerTransformer(new Transformer\FloatTransformer())
    ->registerTransformer(new Transformer\IntegerTransformer())
    ->registerTransformer(new MongoDBTransformer\MongoIdTransformer())
    ->registerTransformer(new MongoDBTransformer\MongoDateTransformer());

// Create a query (Note: the $and key is currently required)
$query = [
    '$and' => [],
];

// Get some filters from somewhere (generally your REST API GET params)
// eg: GET /api/users?filter[]=foo,bar&filter[]=bar,baz
$filters = [
    '*,or 1,2,3',                           // Wrap filters with index 1, 2 and 3 in OR statement
    'profile.firstName,eq John',            // ['profile.firstName' => ['$eq' => 'John']]
    'username,like adm',                    // ['username' => ['$regex' => /adm/i]]
    'enabled,true',                         // ['enabled' => ['$eq' => true]]
    'lastLogin,gte:dt 2015-03-03',          // ['lastLogin' => ['$gte' => ISODate('2015-03-03T00:00:00Z')]]
    'id,ne:id 123412341234123412341234',    // ['id' => ['$ne' => ObjectId('123412341234')]]
    'karma,lt:f 3.6',                       // ['karma' => ['$lt' => 3.6]]
    'location,geo_near 4.4500,51.1333,300', // ['location' => ['$near' => ...]]
];

// Apply filters to the query
$filterSet->applyQueryFilters($query, $filters);

// Get the query result as you normally would
$mongo = new MongoDB\Client("mongodb://:27017");
$result = $mongo->mydb->user->find($query);

测试

在运行 composer install 后运行测试

$ ./scripts/run_tests

许可

LICENSE