rikta / php-query
流畅地查询仓库中的数据
Requires
- php: ^7.4|^8.0
- ext-json: *
- rikta/repository: dev-main
- rikta/timed-loop: ^1.0
- rikta/value-path: ^0.1.0
Requires (Dev)
README
流畅地查询仓库或数组,以匹配特定标准,并将结果按照特定顺序排列。
类似于低成本的php ORM库版本,其中预算甚至不足以覆盖数据库,我们只能满足于会话内存。
与基于数据库的正确库相反,这个库可以在任何可以表示为键值存储或数组的内容上工作。
只需将某些东西的集合(数组、目录中的文件、解码的CSV文件)包装到一个 rikta/repository 中,然后在上面执行查询。
您还可以将查询存储在变量中,然后对不同仓库进行调用,或将其用作可配置的getter。
(为了您的方便,您也可以直接传递一个数组;它将自动转换为 ArrayRepository
)
安装
composer require rikta/php-query
无需配置、无依赖注入、什么都没有。即插即用!
使用方法
- 创建一个新的查询对象,例如
$query = new Query();
- 添加一些操作,例如
$query->not()->isNull()->sort()->limit(10)
- 获取您的结果对象,例如
$result = $query->getResults()
- 从结果中获取您的项目,例如
return $result->toArray()
(带有键)或return $result->getItems()
(不带键)
示例
examples
目录包含几个示例(这些是测试套件的一部分,因此保证可以工作)
其中之一相当详细,它使用100本流行古典书的列表作为输入,并找到1900年后最大的三本英文书籍及其作者
$query = (new \Rikta\PhpQuery\Query()) ->onPathValue('.year')->greaterThanOrEqual(1900) // only books after 1900 ->onPathValue('.language')->identical('English') // only books in english ->onPathValue('.pages')->sort(static fn ($a, $b) => $b <=> $a) // sort by pages, in descending order ->limit(3) // limit the results to three ->onPathValue('.title')->mapToKey() // set the key to $value['title'] ->onPathValue('.author')->mapToValue() // set the value to $value['author'] ->sort(); $results = $query ->getResultsFor(new \Rikta\PhpQuery\Examples\_Data\BookDataRepository()) ->toArray(); \PHPUnit\Framework\assertEquals([ 'The Golden Notebook' => 'Doris Lessing', 'Tales' => 'Edgar Allan Poe', 'Invisible Man' => 'Ralph Ellison', ], $results);
操作
操作是可以调用的对象(=具有状态的调用者,可以说)
- 在构造时获取它们所需的所有数据,也许还有其他操作
- 在调用时获取项目数组
- 对传入的 $items 执行某些操作
- 将其返回以供下一个操作修改
操作分为多个类别。每个操作都将保留其返回中的初始键(除非明确指示 otherwise)。
查询操作类别
过滤器
筛选键/值,例如,针对一个数组或可调用的函数
检查 _FilterOperationMethodsInterface 以获取所有实现筛选方法的最新概述
示例
- 只显示提供的数组中的键
- 只显示大于两的值
操纵
修改数组的顺序和边界,但不修改其值本身(可能除外,丢弃它们)
检查 _JugglingOperationMethodsInterface 以获取所有实现筛选方法的最新概述
示例
- 按值升序排序
- 按键降序排序
- 限制到20个结果
修改
修改另一个操作
检查 _ModificationOperationMethodsInterface 以获取所有实现筛选方法的最新概述
示例
- 反转过滤器(保留将被丢弃的,反之亦然)
- 比较子值而不是值
替换
替换键/值,例如,使用路径中的值或调用函数的结果
查看_ReplacementOperationMethodsInterface以获取所有实现过滤方法的最新概述
示例
- 将返回的值替换为 $value['something'][0]
- 将结果中的键替换为每个值对应的 $value['id']
为什么取这个名字?
最初的名字只是 "Query",但在开发过程中我遇到了像 Rikta\Query\Query\Query
这样的命名空间,所以我将项目重命名以减少这种冗余。
我对更好的名字建议持开放态度 ;)