braincrafted/arrayquery

ArrayQuery 是一个查询数组的库。

v0.1 2013-12-04 16:12 UTC

This package is auto-updated.

Last update: 2024-09-20 09:49:08 UTC


README

ArrayQuery 是一个查询数组的库。

// Select the name of all of Ned's children older than 10.
$query = $qb->create()
    ->select('name')
    ->from([
        [ 'name' => 'Robb',   'age' => 15 ],
        [ 'name' => 'Sansa',  'age' => 11 ],
        [ 'name' => 'Arya',   'age' => 9 ],
        [ 'name' => 'Bran',   'age' => 7 ],
        [ 'name' => 'Rickon', 'age' => 3 ]
    ])
    ->where('age', 10, '>');
$result = $query->findAll();

Build Status Scrutinizer Quality Score Code Coverage

动机

数据通常存储在数组的数组中(例如,从CSV读取后)并且一些项目(或行)在进一步处理或存储到数据库之前需要被挑选出来。编写这样的代码并不难,但它往往会变得混乱。循环嵌套循环、多个if或switch语句、临时变量等等。ArrayQuery 为这些“数组查询”提供了一个干净且可测试的接口(受ORM中的查询构建器启发)。

安装

可以使用 Composer 安装 ArrayQuery

{
    "require": {
        "braincrafted/arrayquery": "dev-master"
    }
}

用法

必须使用 SelectEvaluationWhereEvaluation 对象初始化 ArrayQuery 对象。可以将过滤器添加到 SelectEvaluation,并将过滤器和运算符添加到 WhereEvaluation

<?php

use Braincrafted\ArrayQuery\ArrayQuery;
use Braincrafted\ArrayQuery\SelectEvaluation;
use Braincrafted\ArrayQuery\WhereEvaluation;
use Braincrafted\ArrayQuery\Operator\EqualOperator

$query = new ArrayQuery(
    new SelectEvaluation,
    (new WhereEvaluation)->addOperator(new EqualOperator)
);

但是,可以使用 QueryBuilder 使用内置运算符和过滤器创建 ArrayQuery 实例。

<?php

use Braincrafted\ArrayQuery\QueryBuilder;

$qb = new QueryBuilder;
$query = $qb->create();

可以使用查询对象构建查询并执行它们。构建查询对象包括三个步骤

  1. 选择 要返回的字段
  2. 数据源中
  3. WHERE 条件匹配

在构建查询后,必须执行它。

Select

可以使用星号 * 运算符选择一个项目的所有元素

$query->select('*');

选择一个项目的单个元素

$query->select('name');

选择一个项目的多个元素

$query->select([ 'name', 'age' ]);

两种情况下都可以应用过滤器

$query->select('name', 'trim');
$query->select([ 'name' => 'trim', 'bio' => 'trim' ]);

也可以应用多个过滤器

$query->select('name', [ 'trim', 'upper' ]);
    $query->select(
        [
            'name' => [ 'trim', 'upper' ],
            'bio' => [ 'trim', 'upper' ]
        ]
    );

From

接下来,必须定义从哪个数据源选择

$thorinsCompany = [
    [ 'name' => 'Bilbo Baggins', 'race' => 'Hobbit' ],
    [ 'name' => 'Gandalf', 'race' => 'Wizard' ],
    [ 'name' => 'Thorin Oakenshild', 'race' => 'Dwarf' ],
    [ 'name' => 'Balin', 'race' => 'Dwarf'],
    [ 'name' => 'Bifur', 'race' => 'Dwarf'],
    // ...
];

$query->from($thorinsCompany);

Where

WHERE 子句定义了将哪些项目从数据源放入结果集中

$query->where('race', 'Dwarf');

有许多不同的运算符可用,可以作为第三个参数定义

$query->where('age', 50, '>');

在评估子句之前,可以应用过滤器到测试值上

$query->where('name', 'foo', '=', 'trim');
$query->where('name', 'foo', '=', [ 'trim', 'strtolower' ]);

过滤器可以有参数

$query->where('name', 'nerd', '=', 'replace 3,e');

执行

有多种执行查询的方法。

查找所有结果

$results = $query->findAll();
// [ [ 'name' => 'Balin' ], [ 'name' => 'Bifur' ], ... ]

查找一个结果

$result = $query->findOne();
// [ 'name' => 'Gandalf' ]

注意: 为了性能原因,立即返回第一个结果。当返回多个结果时没有错误或异常。

查找标量结果

$result = $query->findScalar();
// [ 'Balin', 'Bifur', 'Bofur', ... ]

注意: 这仅在仅选择一个字段时才有效,当选择多个字段时(无论是通过枚举还是使用星号运算符)会抛出异常。

查找一个标量结果

$result = $query->findOneScalar()
// 'Gandalf'

注意: 这里适用于 findOne()findScalar() 的同样说明。

内置运算符和过滤器

一些运算符和过滤器是内置的,并且可以直接使用(如果使用 QueryBuilder 创建 ArrayQuery 对象)。

运算符

  • 等于 =
  • 不等于 !=
  • 大于 >
  • 大于等于 >=
  • 小于 <
  • 小于等于 <=
  • 类似 like (不区分大小写,并且可以使用 % 在开始和结束匹配任何内容)
  • 不类似 notlike

过滤器

过滤器可以可选地有参数。通过空格将参数与过滤器名称分开,通过逗号分隔多个参数。

  • 长度 length
  • 小写 lower
  • 大写 upper
  • 修剪 trim
  • 左修剪 ltrim
  • 右修剪 rtrim
  • 替换 replace(两个参数:搜索替换

作者

许可证

有关完整的版权和许可信息,请参阅与源代码一同分发的LICENSE文件。

Bitdeli Badge