mauretto78 / array-query
数组查询
v1.19
2019-10-22 14:50 UTC
Requires
- php: ^5.6 || ^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.3
- phpunit/phpunit: ~5.7
- satooshi/php-coveralls: dev-master
README
数组查询 允许您在多维数组上执行查询。
用例
如果您需要在以下内容上执行查询,则此库适合您
- 静态 PHP 数组
- 内存中存储的数组
- 解析 JSON(或 YAML)文件
基本用法
要实例化 QueryBuilder,请执行以下操作
use ArrayQuery\QueryBuilder; $array = [ [ 'id' => 1, 'title' => 'Leanne Graham', 'email' => 'Sincere@april.biz', 'rate' => 5, 'company' => [ 'name' => 'Romaguera-Jacobson', 'catchPhrase' => 'Face to face bifurcated interface', 'bs' => 'e-enable strategic applications' ] ], [ 'id' => 2, 'title' => 'Ervin Howell', 'email' => 'Shanna@melissa.tv', 'rate' => 3, 'company' => [ 'name' => 'Robel-Corkery', 'catchPhrase' => 'Multi-tiered zero tolerance productivity', 'bs' => 'transition cutting-edge web services' ] ], [ 'id' => 3, 'title' => 'Clementine Bauch', 'email' => 'Nathan@yesenia.net', 'rate' => 4, 'company' => [ 'name' => 'Keebler LLC', 'catchPhrase' => 'User-centric fault-tolerant solution', 'bs' => 'revolutionize end-to-end systems' ] ], // .. ] QueryBuilder::create($array); // to add an element to your array. Do this BEFORE make a query on the array $element = [ 'id' => 4, 'title' => 'Patricia Lebsack', 'email' => 'Julianne.OConner@kory.org', 'rate' => 2, 'company' => [ 'name' => 'Robel-Corkery', 'catchPhrase' => 'Multi-tiered zero tolerance productivity', 'bs' => 'transition cutting-edge web services' ] ]; $qb->addElement($element, 4); // to remove an element from array by his key. Do this BEFORE make a query on the array $qb->removeElement(3);
数据一致性
QueryBuilder 会检查您数据的一致性。如果检测到不一致,将抛出 NotConsistentDataException
异常
use ArrayQuery\QueryBuilder; $array = [ [ 'id' => 1, 'title' => 'Leanne Graham', 'email' => 'Sincere@april.biz', 'rate' => 5, 'company' => [ 'name' => 'Romaguera-Jacobson', 'catchPhrase' => 'Face to face bifurcated interface', 'bs' => 'e-enable strategic applications' ] ], [ 'id' => 2, 'title' => 'Ervin Howell', 'email' => 'Shanna@melissa.tv', 'rate' => 3, 'company' => [ 'name' => 'Robel-Corkery', 'catchPhrase' => 'Multi-tiered zero tolerance productivity', 'bs' => 'transition cutting-edge web services' ] ], [ 'id' => 3, 'title' => 'Clementine Bauch', 'email' => 'Nathan@yesenia.net', 'rate' => 4, 'company' => [ 'name' => 'Keebler LLC', 'catchPhrase' => 'User-centric fault-tolerant solution', 'bs' => 'revolutionize end-to-end systems' ], 'extra-field' => 'this is an extra field' ], ] // NotConsistentDataException will be raised QueryBuilder::create($array);
查询、排序和获取结果
您可以在数组上执行查询。您可以将条件连接起来
use ArrayQuery\QueryBuilder; // .. $qb = QueryBuilder::create($array); $qb ->addCriterion('title', 'Leanne', 'CONTAINS') ->addCriterion('rate', '3', '>') ->sortedBy('title', 'DESC'); // you can search by nested keys $qb->addCriterion('company.name', 'Romaguera-Jacobson'); // get results foreach ($qb->getResults() as $element){ // ... } // get first result $first = $qb->getFirstResult(); // get last result $last = $qb->getLastResult(); // get a result by index $thirdResult = $qb->getResult(3);
可用的条件运算符
=
(默认运算符,可以省略)>
<
<=
>=
!=
ARRAY_MATCH
CONTAINS
(不区分大小写)ENDS_WITH
EQUALS_DATE
GT_DATE
GTE_DATE
IN_ARRAY
IN_ARRAY_INVERSED
LT_DATE
LTE_DATE
STARTS_WITH
可用的排序运算符
ASC
(默认运算符,可以省略)DESC
DATE_ASC
DATE_DESC
连接
请考虑以下完整示例以进行连接
use ArrayQuery\QueryBuilder; $users = [ [ 'id' => 1, 'name' => 'Mauro Cassani', 'id_category' => 3, 'email' => 'assistenza@easy-grafica.com' ],[ 'id' => 2, 'name' => 'Mario Rossi', 'id_category' => 3, 'email' => 'mario.rossi@gmail.com' ],[ 'id' => 3, 'name' => 'Maria Bianchi', 'id_category' => 1, 'email' => 'maria.bianchi@gmail.com' ] ]; $category = [ 'id' => 3, 'name' => 'Web Developer' ]; $qb = QueryBuilder::create($users) ->join($category, 'category', 'id_category', 'id') ->addCriterion('category.id', 3); foreach ($qb->getResults() as $element){ // ... }
限制和偏移
您可以为查询结果添加条件并指定限制和偏移量
use ArrayQuery\QueryBuilder; $qb = QueryBuilder::create($array); $qb ->addCriterion('title', ['Leanne'], 'IN_ARRAY') ->addCriterion('rate', '3', '>') ->sortedBy('title') ->limit(0, 10); foreach ($qb->getResults() as $element){ // ... }
处理日期
您可以根据日期字段执行查询。您可以使用 DATE_ASC
或 DATE_DESC
运算符按日期排序结果。如果您的格式不是 YYYY-mm-dd
,则必须指定 日期格式
use ArrayQuery\QueryBuilder; $qb = QueryBuilder::create($array); $qb ->addCriterion('registration_date', '01/05/2017', 'GT_DATE', 'd/m/Y') ->addCriterion('rate', '3', '>') ->sortedBy('registration_date', 'DATE_DESC', 'd/m/Y') ->limit(0, 10); foreach ($qb->getResults() as $element){ // ... }
别名
您可以使用 as
关键字作为分隔符使用别名。请执行以下操作
use ArrayQuery\QueryBuilder; $qb = QueryBuilder::create($array); $qb ->addCriterion('name as n', 'Ervin Howell') ->addCriterion('username as user', 'Antonette') ->addCriterion('address.street as street', 'Victor Plains'); foreach ($qb->getResults() as $element){ // ... // now you have // $element['n'] // $element['user'] // $element['street'] }
打乱结果
您可以使用 getShuffledResults
方法打乱查询结果
use ArrayQuery\QueryBuilder; $qb = QueryBuilder::create($array); foreach ($qb->getShuffledResults() as $element){ // ... }
更多示例
有关更多示例,请参阅 QueryBuilderTest。
支持
如果您发现了一个问题或有一个想法,请参阅 此部分。
作者
- Mauro Cassani - github
许可
本项目采用 MIT 许可证 - 详细信息请参阅 LICENSE.md 文件。