offline / jsonq
JsonQ 是一个基于 PHP 的 JSON 数据查询库
Requires
- php: >=5.5.0
Requires (Dev)
- graham-campbell/testbench: ^3.1
- phpunit/phpunit: ^4.8 || ^5.0
- symfony/var-dumper: ^3.4
README
JsonQ 是一个简单、优雅的 PHP 包,用于查询任何类型的 JSON 数据。它通过在 JSON 上提供类似于 ORM 的查询功能,使您的生活更加便捷。
支持此项目
嘿 due,请帮助我每天改进这个项目
安装
composer require nahid/jsonq
使用
您可以通过从文件导入 JSON 数据立即开始使用此包
use Nahid/JsonQ/Jsonq; $jsonq = new Jsonq('data.json');
或从 JSON 字符串
$json->json('{"id": 1, "name": "Nahid"}');
或从 PHP 数组
$json->collect(['id'=>1, 'name'=>'Nahid']);
您可以使用各种查询方法(如 find、where、orWhere、whereIn、whereStartsWith、whereEndsWith、whereContains 等)开始查询您的数据。查询后,您还可以使用 sum、count、groupBy、max、min 等方法对数据进行聚合。
让我们看一个快速示例
//data.json { "name": "products", "description": "Features product list", "vendor":{ "name": "Computer Source BD", "email": "info@example.com", "website":"www.example.com" }, "users":[ {"id":1, "name":"Johura Akter Sumi", "location": "Barisal"}, {"id":2, "name":"Mehedi Hasan Nahid", "location": "Barisal"}, {"id":3, "name":"Ariful Islam", "location": "Barisal"}, {"id":4, "name":"Suhel Ahmed", "location": "Sylhet"}, {"id":5, "name":"Firoz Serniabat", "location": "Gournodi"}, {"id":6, "name":"Musa Jewel", "location": "Barisal", "visits": [ {"name": "Sylhet", "year": 2011}, {"name": "Cox's Bazar", "year": 2012}, {"name": "Bandarbar", "year": 2014} ]} ], "products": [ {"id":1, "user_id": 2, "city": "bsl", "name":"iPhone", "cat":1, "price": 80000}, {"id":2, "user_id": 2, "city": null, "name":"macbook pro", "cat": 2, "price": 150000}, {"id":3, "user_id": 2, "city": "dhk", "name":"Redmi 3S Prime", "cat": 1, "price": 12000}, {"id":4, "user_id": 1, "city": null, "name":"Redmi 4X", "cat":1, "price": 15000}, {"id":5, "user_id": 1, "city": "bsl", "name":"macbook air", "cat": 2, "price": 110000}, {"id":6, "user_id": 2, "city": null, "name":"macbook air 1", "cat": 2, "price": 81000} ] }
use Nahid\JsonQ\Jsonq; $q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 2) ->get(); dump($res); //This will print /* array:3 [▼ 1 => {#7 ▼ +"id": 2 +"user_id": 2 +"city": null +"name": "macbook pro" +"cat": 2 +"price": 150000 } 4 => {#8 ▼ +"id": 5 +"user_id": 1 +"city": "bsl" +"name": "macbook air" +"cat": 2 +"price": 110000 } 5 => {#9 ▼ +"id": 6 +"user_id": 2 +"city": null +"name": "macbook air 1" +"cat": 2 +"price": 81000 } ] */
假设我们想要获取查询结果中 price 的总和。我们可以通过调用 sum() 方法而不是 get() 来轻松完成它
$result = $json->from('products') ->where('cat', '=', 2) ->sum('price'); dump($result); //It will print: /* 365000 */
很酷,不是吗?
让我们探索完整的 API,看看这个库还能为您做些什么神奇的事情。好吗?
API
以下 API 示例基于此处提供的示例 JSON 数据 here。要更好地了解示例,请先查看该 JSON 数据。有关每个 API 的详细示例,请参阅 此处。
API 列表
- fetch
- find
- at
- from
- select
- except
- then
- collect
- json
- import
- where
- orWhere
- whereIn
- whereNotIn
- whereNull
- whereNotNull
- whereStartsWith
- whereEndsWith
- whereContains
- whereMatch
- sum
- count
- size
- max
- min
- avg
- first
- last
- nth
- column
- implode
- exists
- groupBy
- sort
- sortBy
- reset
- copy
- toJson
- keys
- values
- filter
- transform
- each
- pipe
- chunk
- macro
fetch()
此方法将执行查询并返回结果数据。您需要在使用某些查询方法后最终调用它。详细信息请参阅其他 API 示例。
find(path)
path
-- 您要查找的数据的路径层次结构。
您不需要在之后调用 fetch()
方法。因为这个方法将自行获取并返回数据。
注意:您不能在它之后链进一步查询方法。如果需要,应使用 at()
或 from()
方法。
示例
假设您想要获取 JSON 数据中 'cities' 属性的值。您可以这样做:
$q = new Jsonq('data.json'); echo $q->find('vendor.name');
如果您想要更深入地遍历层次结构,您可以这样做:
$q = new Jsonq('data.json'); echo $q->find('vendor.name');
请参阅 此处 的详细示例。
from(path)
path
(可选) -- 您要开始查询的数据的路径层次结构。
默认情况下,查询将从您提供的JSON数据的根开始。如果您想首先移动到从您想要开始查询的数据的嵌套路径层次结构,您将使用此方法。跳过path
参数或使用'.'作为参数也将从根数据开始查询。
此方法与find()
方法的区别在于,find()
方法将返回给定路径层次结构的数据。另一方面,此方法将返回对象实例,这样您可以在其后进一步链式调用查询方法。
示例
假设您想要从您的JSON数据中的'vendor.name'属性值开始查询。您可以这样做:
$q = new Jsonq('data.json'); echo $q->from('vendor.name')->get();
如果您想要更深入地遍历层次结构,您可以这样做:
$q = new Jsonq('data.json'); echo $q->from('users.5.visits')->get();
请参阅详细示例这里。
at(path)
这是from()
的别名方法,其行为与完全相同。请参阅示例这里。
where(key, condition, val)
-
key
-- 数据的属性名。或者您可以将函数传递到这里,以在它内部进行多个查询。请参阅示例中的详细信息。 -
val
-- 要匹配的值。它可以是一个int、string、bool,甚至是一个Function - 这取决于op
。 -
op
-- 用于匹配的操作数。以下操作数可供使用:=
: 用于弱等于匹配eq
: 与=
相同!=
: 用于弱不等式匹配neq
: 与!=
相同==
: 用于严格等于匹配seq
: 与==
相同!==
: 用于严格不等式匹配sneq
: 与!==
相同>
: 检查数据中给定key
的值是否大于val
gt
: 与>
相同<
: 检查数据中给定key
的值是否小于val
lt
: 与<
相同>=
: 检查数据中给定key
的值是否大于或等于val
gte
: 与>=
相同<=
: 检查数据中给定key
的值是否小于或等于val
lte
: 与<=
相同null
: 检查数据中给定key
的值是否为null
(在where()
中,对于此op
,可以省略val
参数)notnull
: 检查数据中给定key
的值是否不为null
(在where()
中,对于此op
,可以省略val
参数)in
: 检查数据中给定key
的值是否存在于给定的val
中。val
应该是一个普通的Array。notin
: 检查数据中给定key
的值是否不存在于给定的val
中。val
应该是一个普通的Array。startswith
: 检查数据中给定key
的值是否以(具有给定的前缀)给定的val
开始。这仅适用于String类型数据。endswith
: 检查数据中给定key
的值是否以(具有给定的后缀)给定的val
结束。这仅适用于String类型数据。contains
: 检查数据中给定key
的值是否包含给定的val
的子串。这仅适用于String类型数据。match
:检查数据中给定 key 的值是否与给定的正则表达式 val 匹配。对于此op
,val
参数应为一个 RegExp。macro
:它会尝试匹配数据中给定 key 的值并执行给定的val
。对于此op
,val
参数应为一个 Function。此函数应包含匹配逻辑,并根据该逻辑返回 true 或 false。
示例
假设您想找到具有 id 为 1
的 'users'。您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('users')->where('id', '=', 1)->get();
您可以添加多个 where 条件。它将通过 AND 操作这些多个 where 条件来给出结果。
$q = new Jsonq('data.json'); $res = $q->from('users') ->where('id', '=', 1) ->where('location', '=', 'barisal') ->get();
请参阅详细示例 这里。
orWhere(key, op, val)
where()
的参数与 whereOr()
相同。where()
和 whereOr()
之间的唯一区别是:由 whereOr()
方法给出的条件将与其他条件进行 OR 操作。
例如,如果您想找到具有 id 为 1
或 2
的用户,您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('users') ->where('id', '=', 1) ->orWhere('id', '=', 2) ->get();
请参阅详细示例 这里。
whereIn(key, val)
key
-- 数据的属性名val
-- 它应该是一个 Array
此方法将表现得像调用 where(key, 'in', val)
方法。
whereNotIn(key, val)
key
-- 数据的属性名val
-- 它应该是一个 Array
此方法将表现得像调用 where(key, 'notin', val)
方法。
whereNull(key)
key
-- 数据的属性名
此方法将表现得像调用 where(key, 'null')
或 where(key, '=', null)
方法。
whereNotNull(key)
key
-- 数据的属性名
此方法将表现得像调用 where(key, 'notnull')
或 where(key, '!=', null)
方法。
whereStartsWith(key, val)
key
-- 数据的属性名val
-- 它应该是一个 String
此方法将表现得像调用 where(key, 'startswith', val)
方法。
whereEndsWith(key, val)
key
-- 数据的属性名val
-- 它应该是一个 String
此方法将表现得像调用 where(key, 'endswith', val)
方法。
whereContains(key, val)
key
-- 数据的属性名val
-- 它应该是一个 String
此方法将表现得像调用 where(key, 'contains', val)
方法。
sum(column)
column
-- 数据的属性名
示例
假设您想找到 'products' 中 'price' 的总和。您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->sum('price');
如果您正在聚合的数据是纯数组,您不需要传递 'column' 参数。请参阅详细示例 这里
count()
它将返回集合中的元素数量。
示例
假设您想找到 'products' 属性中的元素数量。您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->count();
请参阅详细示例 这里。
size()
这是 count()
的别名方法。
max(column)
column
-- 数据的属性名
示例
假设您想找到 'products' 中 'price' 的最大值。您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->max('price);
如果您正在查询的数据是纯数组,您不需要传递 'column' 参数。请参阅详细示例 这里
min(column)
column
-- 数据的属性名
示例
假设您想找到 'products' 中 'price' 的最小值。您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->min('price');
如果您正在查询的数据是纯数组,您不需要传递 'property' 参数。请参阅详细示例 这里
avg(column)
column
-- 数据的属性名
示例
假设您想找到'products'中'price'的平均值。您可以这样操作
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->avg('price');
如果您查询的数据是普通数组,则不需要传递'column'参数。请参阅详细示例这里
first()
它将返回集合的第一个元素。
示例
$q = new jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->first();
请参阅详细示例这里。
last()
它将返回集合的最后一个元素。
示例
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->last();
请参阅详细示例这里。
nth(index)
index
-- 要返回的元素的索引。
它将返回集合的第n个元素。如果给定的索引是正数,则从开始返回第n个元素。如果给定的索引是负数,则从末尾返回第n个元素。
示例
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->nth(2);
请参阅详细示例这里。
exists()
如果元素不是空或不是空或不是空数组或不是空对象,则返回true
。
示例
假设您想找到 'products' 属性中的元素数量。您可以这样做
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->exists();
请参阅详细示例这里。
groupBy(column)
column
-- 按此属性对集合进行分组。
示例
假设您想根据'location'属性对'users'数据分组。您可以这样操作
$q = new Jsonq('data.json'); $res = $q->from('users') ->groupBy('location') ->get();
请参阅详细示例这里。
sort(order)
order
-- 如果省略'order'属性,则默认按ascending
顺序排序。要按descending
顺序排序数据,需要将'order'参数传递为desc
。您还可以在'order'参数中传递一个比较函数,以定义自己的数据排序逻辑。
注意:应使用此方法对普通数组进行排序。如果要对对象数组进行排序,应使用稍后描述的sortBy()
方法。
示例
假设您想对'arr'数据进行排序。您可以这样操作
$q = new Jsonq(); $res = $q->collect([7, 5, 9, 1, 3]) ->sort();
请参阅详细示例这里。
sortBy(column, order)
column
-- 需要传递用于排序的列名。order
-- 如果省略'order'属性,则默认按ascending
顺序排序。要按descending
顺序排序数据,需要将'order'参数传递为desc
。您还可以在'order'参数中传递一个比较函数,以定义自己的数据排序逻辑。
注意:应使用此方法对对象数组进行排序。如果要对普通数组进行排序,应使用前面描述的sort()
方法。
示例
假设您想对'products'中'price'的数据进行排序。您可以这样操作
$q = new Jsonq('data.json'); $res = $q->from('products') ->where('cat', '=', 1) ->sortBy('price', 'desc');
请参阅详细示例这里。
reset(data)
data
-- 可以是JSON文件路径,也可以是JSON字符串或JSON对象。如果没有在data
参数中传递数据,则jsonQ
对象实例将重置为先前初始化的数据。
在任何时候,您可能希望将对象实例重置为完全不同的数据集,然后对其进行查询。在这种情况下,您可以使用此方法。
请参阅详细示例这里。
copy()
它将返回对象实例的完整克隆。
请参阅详细示例这里。
错误和问题
如果您遇到任何错误或问题,请随时在github上创建问题。
此外,您也可以给我发邮件到mailto:nahid.dns@gmail.com,用于请求拥抱或报告错误。
其他平台
此包还支持多种语言。
- JavaScript JsonQ由Ahmed shamim开发
- Python JsonQ由Shaon Shaonty开发
- Go JsonQ由Saddam H开发 - 即将推出
在Beerpay上支持
嘿,兄弟!帮帮我,给我来几杯🍻吧!