offline/jsonq

JsonQ 是一个基于 PHP 的 JSON 数据查询库

v5.2.7 2021-10-26 15:31 UTC

README

JsonQ 是一个简单、优雅的 PHP 包,用于查询任何类型的 JSON 数据。它通过在 JSON 上提供类似于 ORM 的查询功能,使您的生活更加便捷。

支持此项目

嘿 due,请帮助我每天改进这个项目

Beerpay

安装

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']);

您可以使用各种查询方法(如 findwhereorWherewhereInwhereStartsWithwhereEndsWithwhereContains 等)开始查询您的数据。查询后,您还可以使用 sumcountgroupBymaxmin 等方法对数据进行聚合。

让我们看一个快速示例

//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()

此方法将执行查询并返回结果数据。您需要在使用某些查询方法后最终调用它。详细信息请参阅其他 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 -- 要匹配的值。它可以是一个intstringbool,甚至是一个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 匹配。对于此 opval 参数应为一个 RegExp
    • macro:它会尝试匹配数据中给定 key 的值并执行给定的 val。对于此 opval 参数应为一个 Function。此函数应包含匹配逻辑,并根据该逻辑返回 truefalse

示例

假设您想找到具有 id1'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 操作。

例如,如果您想找到具有 id12 的用户,您可以这样做

$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,用于请求拥抱或报告错误。

其他平台

此包还支持多种语言。

在Beerpay上支持

嘿,兄弟!帮帮我,给我来几杯🍻吧!

Beerpay Beerpay