rikta/php-query

流畅地查询仓库中的数据

0.1.3 2021-09-29 16:44 UTC

This package is auto-updated.

Last update: 2024-09-29 05:43:18 UTC


README

packagist name version php version

license GitHub commit activity open issues closed issues

ci dependabot maintainability score tech debt % maintainability issues

流畅地查询仓库或数组,以匹配特定标准,并将结果按照特定顺序排列。

类似于低成本的php ORM库版本,其中预算甚至不足以覆盖数据库,我们只能满足于会话内存。

与基于数据库的正确库相反,这个库可以在任何可以表示为键值存储或数组的内容上工作。

只需将某些东西的集合(数组、目录中的文件、解码的CSV文件)包装到一个 rikta/repository 中,然后在上面执行查询。

您还可以将查询存储在变量中,然后对不同仓库进行调用,或将其用作可配置的getter。

(为了您的方便,您也可以直接传递一个数组;它将自动转换为 ArrayRepository

安装

composer require rikta/php-query

无需配置、无依赖注入、什么都没有。即插即用!

使用方法

  1. 创建一个新的查询对象,例如 $query = new Query();
  2. 添加一些操作,例如 $query->not()->isNull()->sort()->limit(10)
  3. 获取您的结果对象,例如 $result = $query->getResults()
  4. 从结果中获取您的项目,例如 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 这样的命名空间,所以我将项目重命名以减少这种冗余。

我对更好的名字建议持开放态度 ;)