braincrafted / arrayquery
ArrayQuery 是一个查询数组的库。
Requires (Dev)
- mockery/mockery: 0.8.*
- phpunit/phpunit: 3.7.*
- sami/sami: 1.2.*
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();
动机
数据通常存储在数组的数组中(例如,从CSV读取后)并且一些项目(或行)在进一步处理或存储到数据库之前需要被挑选出来。编写这样的代码并不难,但它往往会变得混乱。循环嵌套循环、多个if或switch语句、临时变量等等。ArrayQuery 为这些“数组查询”提供了一个干净且可测试的接口(受ORM中的查询构建器启发)。
安装
可以使用 Composer 安装 ArrayQuery
{ "require": { "braincrafted/arrayquery": "dev-master" } }
用法
必须使用 SelectEvaluation
和 WhereEvaluation
对象初始化 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();
可以使用查询对象构建查询并执行它们。构建查询对象包括三个步骤
- 选择 要返回的字段
- 从 数据源中
- 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文件。