它简单地将给定的过滤器、排序和分页转换成Doctrine或Eloquent查询。适用于内部使用,也可以用于API。

v1.1.6 2017-11-28 09:21 UTC

README

Build Status Total Downloads Latest Stable Version License

查询

它简单地将给定的过滤器、排序和分页转换成Doctrine或Eloquent查询。适用于内部使用,也可以用于API。

安装

通过composer安装Query库。

composer require onemustcode/query

查询

Query包含分页、排序、过滤和包含项。

创建新的Query实例;

$query = new Query();

分页

更改每页的结果数量;

$query->getPaging()->setPerPage(50);

更改页面;

$query->getPaging()->setPage(5);

直接从给定的分页对象创建Query实例;

$query = Query::createFromPaging(new Paging(3, 40));

过滤

可以使用以下过滤器;

向现有Query实例添加新的过滤器;

$query->addFilter(new Equals('last_name', 'john'));

直接从一个或多个过滤器创建Query实例;

$query = Query::createFromFilters([
    new Equals('name', 'john),
    new GreatherThan('age', 23),
]);

排序

向现有Query实例添加新的排序;

$query->addSorting(new Ascending('last_name'));

直接从一个或多个排序创建Query实例;

$query = Query::createFromSortings([
    new Ascending('name'),
    new Descending('score'),
]);

包含

向现有Query实例添加新的包含项;

$query->addInclude('posts.comments);

直接从一个或多个包含项创建Query实例;

$query = Query::createFromIncludes([
    'relation', 'some_other.relation'
]);

构建器

警告:Builder类已弃用,请使用转换器代替。

构建器将给定的数组转换为Query实例;

$data = [
    'per_page' => 20,
    'page' => 2,
    'filters' => [
        'age' => ['eq' => 15],
        'last_name' => ['like' => 'doe%'],
    ],
    'sortings' => [
        'first_name' => 'asc',
        'score' => 'desc',
    ],
];

$builder = new Builder($data);
$query = $builder->build();

转换器

转换器将给定的数组转换为Query实例;

$data = [
    'per_page' => 20,
    'page' => 2,
    'filters' => [
        'age' => ['eq' => 15],
        'last_name' => ['like' => 'doe%'],
    ],
    'sortings' => [
        'first_name' => 'asc',
        'score' => 'desc',
    ],
];

$transformer = new Transformer();
$query = $transformer->transform($data);

可以添加自定义过滤器。为此,应在构造函数中传递它们作为关联数组(注意,过滤器应实现OneMustCode(Query\Filters\FilterInterface)接口)。键应该是过滤器的操作符,值是过滤器的全称;

$transformer = new Transformer([CustomFilter::OPERATOR => CustomFilter::class]);
$query = $transformer->transform($data);

编写器

编写器可以将给定的Query实例导出为json、查询参数和数组。

JSON

$writer = new Writer($query);
$parameters = $writer->toJson();

数组

$writer = new Writer($query);
$parameters = $writer->toArray();

查询参数

$writer = new Writer($query);
$parameters = $writer->toQueryParameters();

Doctrine查询构建器

以下示例代码显示了如何使用Doctrine查询构建器。只需传递Query实例、Doctrine查询构建器、接受的过滤器或排序,它将自动为您生成查询。

示例

// Get the Doctrine Query Builder
$queryBuilder = $this->createQueryBuilder('e');

// Create new Query instance from given filters en sortings
$query = new Query(null, [
    new GreatherThan('age', 25),
    new LessThan('age', 55),
], [
    new Ascending('last_name')),
]);

// Only accept certain sortings that can be added to the doctrine query builder
$acceptedSortings = [
    // Given field => Doctrine property
    'age' => 'e.age',
];

// Only accept certain filters that can be added to the doctrine query builder
$acceptedFilters = [
    // Given field => Doctrine property
    'first_name' => 'e.firstName',
    'last_name' => 'e.lastName',
    'age' => 'e.age',
];

// Build the query
$queryBuilder = (new QueryBuilder())->build($query, $queryBuilder, $acceptedFilters, $acceptedSortings);

// Retrieve the results via Doctrine
$results = $queryBuilder->getQuery()->getResults();

可以添加自定义的过滤器处理器。为此,应在QueryBuilder的构造函数中传递处理器(注意,过滤器处理器应实现OneMustCode(Query\Builders\Doctrine\Filters\FilterHandlerInterface)接口);

$queryBuilder = (new QueryBuilder([new CustomFilterHandler()]))->build($query, $queryBuilder, $acceptedFilters, $acceptedSortings);

许可证

MIT