minnur / array-query
数组查询
v1.0.4
2022-10-16 13:06 UTC
This package is auto-updated.
Last update: 2024-09-16 17:22:42 UTC
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_MATCHCONTAINS(不区分大小写)ENDS_WITHEQUALS_DATEGT_DATEGTE_DATEIN_ARRAYIN_ARRAY_INVERSEDLT_DATELTE_DATESTARTS_WITH
可用的排序运算符
ASC(默认运算符,可以省略)DESCDATE_ASCDATE_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 文件。