koochik/queryhall

一个PHP包,允许您根据查询参数对Doctrine DBAL SQL数据库查询进行排序、过滤和分页

dev-main 2024-07-13 09:24 UTC

This package is not auto-updated.

Last update: 2024-09-22 08:22:31 UTC


README

QueryHall是一个PHP库,允许您对数据库抽象层的查询构建实例进行排序、过滤和分页,例如Doctrine DBAL或Eloquent。它提供了一个现成的DBAL具体类,允许根据PSR请求对象(使用查询参数)对Doctrine DBAL查询进行过滤、排序和分页。

特性

  • 抽象查询构建器:轻松集成到各种数据库抽象层。
  • 排序:根据多个标准对查询进行排序。
  • 过滤:对查询应用复杂的过滤器。
  • 分页:高效地对查询结果进行分页。
  • PSR-7兼容性:与PSR-7请求对象无缝协作。
  • 灵活的查询解析算法:使用可定制的解析器轻松解析查询参数,该解析器可以替换。
  • 内置基本验证器:使用内置的BasicValidator验证过滤规则。
  • 高度可定制:几乎可以定制此库的各个方面,包括

安装

使用Composer安装库

composer require koochik/queryhall

使用内置的Dbal实现

$app->get('/users', function (Request $request) {
    $queryString = $request->getUri()->getQuery();
    parse_str($queryString, $queryParams);

    $connectionParams = [
        'dbname' => 'DataBase',
        'user' => 'root',
        'password' => '',
        'host' => 'localhost',
        'driver' => 'pdo_mysql',
    ];

    $conn = DriverManager::getConnection($connectionParams);
    $queryBuilder = $conn->createQueryBuilder();
    $queryBuilder->select('*')->from('users');

    $queryHall = new SortAndPaginate($queryBuilder, $queryParams);
    $response = new Response();
    $data = $queryHall->getPaginatedResult();
    
    $response->getBody()->write(json_encode($data));
    return $response->withHeader('Content-Type', 'application/json');
});

然后请求users?where=[id,>,2]&sort=[name,-1]&perPage=5&p=2将获取id > 2的用户,按name降序排序,每页5项分页,并从第2页返回结果。结果类似于


{
    "data": [
        {
            "id": 4,
            "name": "Emily",
            "lastName": "Brown",
            "age": 35,
            "isActive": 1,
            "height": 170.8
        },
        {
            "id": 5,
            "name": "Daniel",
            "lastName": "Williams",
            "age": 22,
            "isActive": 0,
            "height": 176.5
        },
        {
            "id": 9,
            "name": "Benjamin",
            "lastName": "Martinez",
            "age": 31,
            "isActive": 1,
            "height": 180.6
        }
    ],
    "meta": {
        "current_page": 2,
        "per_page": 5,
        "last_page": 2,
        "total": 8,
        "from": 6,
        "to": 8
    }
}