onemustcode / query
它简单地将给定的过滤器、排序和分页转换成Doctrine或Eloquent查询。适用于内部使用,也可以用于API。
Requires
- php: >=5.6.4
Requires (Dev)
- illuminate/database: ~5.4
- mockery/mockery: dev-master
- phpunit/phpunit: ^5.7.0
README
查询
它简单地将给定的过滤器、排序和分页转换成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