ngekoding/codeigniter-api-query-parser

基于CodeIgniter的REST-API查询解析器

v1.0.2 2023-06-13 14:12 UTC

This package is auto-updated.

Last update: 2024-09-13 16:54:13 UTC


README

基于CodeIgniter框架的简单请求查询参数解析器。适用于CodeIgniter 3和CodeIgniter 4。

灵感来自 Lumen API Query Parser

要求

  • PHP 5.6或更高版本
  • CodeIgniter 3或CodeIgniter 4
  • PHPSQLParser ^4.5

安装

只需使用composer,一切都会完成。

composer require ngekoding/codeigniter-api-query-parser

用法

以下是CodeIgniter 3和CodeIgniter 4的示例。实际上,使用库的方式没有不同,只是创建查询构建器的不同。

CodeIgniter 3 示例

// CodeIgniter 3 Example

// Get a query builder
// Please note: we don't need to call ->get() here
$queryBuilder = $this->db->select('p.*, c.name category')
                    ->from('posts p')
                    ->join('categories c', 'c.id=p.category_id');

/**
 * The first parameter is the query builder instance
 * and the second is the codeigniter version (3 or 4) 
 */
$queryParser = new \Ngekoding\CodeIgniterApiQueryParser\QueryParser($queryBuilder);
$result = $queryParser->applyParams(); // done

print_r($result);

上述示例将输出一个包含 datapagination 的数组

Array
(
    [data] => Array
        (
            [0] => ...
            [1] => ...
        )
    [pagination] => Array
        (
            [current_page] => int
            [per_page] => int
            [from] => int
            [to] => int
            [total] => int
            [last_page] => int
            [links] => Array
                (
                    [first] => string
                    [prev] => string or null
                    [next] => string or null
                    [last] => string
                )
        )
)

CodeIgniter 4 示例

区别仅在于创建查询构建器的方式。

// CodeIgniter 4 Example

$db = db_connect();
$queryBuilder = $db->from('posts p')
                   ->select('p.*, c.name category')
                   ->join('categories c', 'c.id=p.category_id');

$queryParser = new \Ngekoding\CodeIgniterApiQueryParser\QueryParser($queryBuilder);
$result = $queryParser->applyParams(); // done

print_r($result);

查询语法

过滤

Q: /users?filter[]=name:ct:admin
R: 将返回包含 admin 字符串的用户的数组

可用的过滤选项

排序

Q: /users?sort[]=name:ASC
R: 将返回按 names 升序排序的用户的数组

分页

Q: /users?limit=10&page=3
R: 将返回用户数组的一部分(从第21项到第30项)

列别名

当与SQL表达式一起选择数据或使用具有模糊列名的连接时,库将自动尝试查找原始列名或其表达式以用于过滤功能。但是,您仍然可以手动定义列别名以更好地使用,特别是当使用连接时解决模糊列名。

例如,在上面的示例中将posts表与categories表连接将返回来自posts表的 id。因此,当我们尝试使用 filter[]=id:in:1,2,3 过滤器获取具有 id 1、2或3的数据时(SQL WHERE IN),我们将遇到模糊列名错误。

以下是 列别名 以解决这个问题。

$queryParser = new \Ngekoding\CodeIgniterApiQueryParser\QueryParser($queryBuilder);

// Tell that the `id` is `p.id` (posts table id)
$queryParser->addColumnAlias('id', 'p.id');

// Or add multiple aliases at once
$queryParser->addColumnAlias([
    'id' => 'p.id',
    'title' => 'p.title'
]);

$result = $queryParser->applyParams(); // done