JsonQ — это простой и элегантный PHP-пакет для запроса любого типа данных JSON. Это облегчит вашу жизнь, придав вашему JSON вид запроса, подобного ORM.
Привет, пожалуйста, помогите мне ежедневно улучшать этот проект.
Начиная с версии JsonQ 6.0 все возможности переписаны из QAarray. После долгой работы мы заметили, что Query Engine для JsonQ должен быть отдельным. Потому что люди хотят запрашивать различные типы данных, такие как CSV, YAML, XML. Поэтому, если мы будем тесно связывать механизм запросов с этим проектом, это не будет иметь смысла. Вот почему мы перемещаем часть Query Engine и разрабатываем новый пакет QAarray. Qarray предназначен для выполнения запросов к собственному массиву PHP, и каждый может реализовать свой собственный движок, например JsonQ.
Пожалуйста, не обновляйте версию >= 6.0 непосредственно ниже.
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 илиWhere , whereIn , whereStartsWith , whereEndsWith , whereContains и т. д. Также вы можете агрегировать свои данные после запроса, используя sum , count , groupBy , max , min и т. д.
Давайте посмотрим быстрый пример:
//data.json
{
"name" : " products " ,
"description" : " Features product list " ,
"vendor" :{
"name" : " Computer Source BD " ,
"email" : " [email protected] " ,
"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
}
]
*/
Допустим, мы хотим получить суммирование цены запрошенного результата. Мы можем сделать это легко, вызвав метод sum() вместо get() :
$ result = $ json -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 2 )
-> sum ( ' price ' );
dump ( $ result );
//It will print:
/*
365000
*/
Довольно аккуратно, да?
Давайте изучим весь API, чтобы увидеть, какие еще чудеса может сделать для вас эта библиотека. А не ___ ли нам?
Следующие примеры API показаны на основе приведенных здесь примеров данных JSON. Чтобы лучше понять примеры, сначала просмотрите данные JSON. Также подробные примеры каждого API можно найти здесь.
Список API:
fetch()
Этот метод будет выполнять запросы и возвращать результирующие данные. Вам нужно наконец вызвать его после использования некоторых методов запроса. Подробности можно найти в других примерах API.
find(path)
path
— иерархия путей данных, которые вы хотите найти. После этого вам не нужно вызывать метод fetch()
. Потому что этот метод сам будет получать и возвращать данные.
предостережение: после него нельзя связывать дополнительные методы запроса. Если вам это нужно, вам следует использовать метод at()
или from()
.
пример:
Допустим, вы хотите получить значение свойства «города» ваших данных Json. Вы можете сделать это следующим образом:
$ 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
или указание '.' параметр as также запустит запрос из корневых данных.
Разница между этим методом и find()
заключается в том, что метод find()
возвращает данные из заданной иерархии путей. С другой стороны, этот метод вернет экземпляр Object, так что после него вы сможете связать методы запроса.
пример:
Допустим, вы хотите начать запрос значений свойстваvendor.name ваших данных JSON. Вы можете сделать это следующим образом:
$ 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 или даже функция — в зависимости от op
.
op
— операнд, который будет использоваться для сопоставления. Доступны следующие операнды:
=
: Для слабого сопоставления равенстваeq
: То же, что =
!=
: для слабого сопоставления без равенстваneq
: То же, что и !=
==
: для строгого сопоставления равенстваseq
: То же, что ==
!==
: для строгого соответствия, не являющегося равенством.sneq
: То же, что и !==
>
: проверить, превышает ли значение данного ключа в данных значение val.gt
: То же, что >
<
: проверить, меньше ли значение данного ключа в данных, чем val.lt
: То же, что и <
>=
: проверить, больше ли значение данного ключа в данных или равно значению val.gte
: То же, что >=
<=
: проверить, меньше ли значение данного ключа в данных или равно значению val.lte
: То же, что <=
null
: проверьте, является ли значение данного ключа в данных нулевым (параметр val
where()
может быть опущен для этой op
)notnull
: проверьте, не является ли значение данного ключа в данных нулевым (параметр val
where()
может быть опущен для этой op
)in
: проверяет, существует ли значение данного ключа в данных в данном val . val должен быть простым массивом .notin
: Проверить, не существует ли значение данного ключа в данных в данном val . val должен быть простым массивом .startswith
: проверяет, начинается ли значение данного ключа в данных с (имеет ли префикс) данного val . Это будет работать только для данных типа String .endswith
: проверяет, заканчивается ли значение данного ключа в данных (имеет ли суффикс) заданным val . Это будет работать только для данных типа String .contains
: Проверяет, имеет ли значение данного ключа в данных подстроку данного значения . Это будет работать только для данных типа String .match
: проверяет, соответствует ли значение данного ключа в данных регулярному выражению с данным значением . Для этой op
параметр val
должен быть RegExp .macro
: он попытается сопоставить значение данного ключа в данных, выполняя заданное val
. Параметр val
должен быть функцией для этой op
. Эта функция должна иметь внутри себя соответствующую логику и возвращать true или false в зависимости от этого.пример:
Допустим, вы хотите найти «пользователей» с id
1
. Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )-> where ( ' id ' , ' = ' , 1 )-> get ();
Вы можете добавить несколько условий . Результат будет получен путем И между этими несколькими условиями.
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> where ( ' location ' , ' = ' , ' barisal ' )
-> get ();
Подробный пример смотрите здесь.
orWhere(key, op, val)
Параметры orWhere()
такие же, как where()
. Единственная разница междуwhere where()
и orWhere()
заключается в том, что условие, заданное методом orWhere()
будет объединять результат с помощью операции ИЛИ с другими условиями.
Например, если вы хотите найти пользователей с идентификатором 1
или 2
, вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> orWhere ( ' id ' , ' = ' , 2 )
-> get ();
Подробный пример смотрите здесь.
whereIn(key, val)
key
- имя свойства данныхval
- это должен быть массив Этот метод будет вести себя как вызов методаwhere where(key, 'in', val)
.
whereNotIn(key, val)
key
- имя свойства данныхval
- это должен быть массив Этот метод будет вести себя как вызов методаwhere where(key, 'notin', val)
.
whereNull(key)
key
- имя свойства данных Этот метод будет вести себя как вызов методаwhere where(key, 'null')
илиwhere where(key, '=', null)
.
whereNotNull(key)
key
- имя свойства данных Этот метод будет вести себя как вызов методаwhere where(key, 'notnull')
илиwhere where(key, '!=', null)
.
whereStartsWith(key, val)
key
- имя свойства данныхval
- это должна быть строка Этот метод будет вести себя как вызов where(key, 'startswith', val)
.
whereEndsWith(key, val)
key
- имя свойства данныхval
- это должна быть строка Этот метод будет вести себя как вызов методаwhere where(key, 'endswith', val)
.
whereContains(key, val)
key
- имя свойства данныхval
- это должна быть строка Этот метод будет вести себя как вызов методаwhere where(key, 'contains', val)
.
sum(column)
column
— имя свойства данныхпример:
Допустим, вы хотите найти сумму «цен» «продуктов» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> sum ( ' price ' );
Если данные, которые вы агрегируете, представляют собой простой массив, вам не нужно передавать параметр «столбец». Подробный пример см. здесь.
count()
Он вернет количество элементов в коллекции.
пример:
Допустим, вы хотите узнать, сколько элементов содержится в свойстве «продукты» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> count ();
Подробный пример смотрите здесь.
size()
Это псевдоним метода count()
.
max(column)
column
— имя свойства данныхпример:
Допустим, вы хотите найти максимальную «цену» «продуктов» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
->max('price);
Если данные, которые вы запрашиваете, представляют собой простой массив, вам не нужно передавать параметр «столбец». Подробный пример см. здесь.
min(column)
column
— имя свойства данныхпример:
Допустим, вы хотите найти минимальную «цену» «продуктов» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> min ( ' price ' );
Если данные, которые вы запрашиваете, представляют собой простой массив, вам не нужно передавать параметр «свойство». Подробный пример см. здесь.
avg(column)
column
— имя свойства данныхпример:
Допустим, вы хотите найти среднее значение «цены» «продуктов» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> avg ( ' price ' );
Если данные, которые вы запрашиваете, представляют собой простой массив, вам не нужно передавать параметр «столбец». Подробный пример см. здесь.
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, если элемент не пуст , не равен нулю , не является пустым массивом или не является пустым объектом .
пример:
Допустим, вы хотите узнать, сколько элементов содержится в свойстве «продукты» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> exists ();
Подробный пример смотрите здесь.
groupBy(column)
column
— свойство, по которому вы хотите сгруппировать коллекцию.пример:
Допустим, вы хотите сгруппировать данные «пользователей» на основе свойства «местоположение» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> groupBy ( ' location ' )
-> get ();
Подробный пример смотрите здесь.
sort(order)
order
— если вы пропустите свойство «order», данные по умолчанию будут упорядочены по возрастанию . Вам нужно передать «desc» в качестве параметра «order» , чтобы отсортировать данные в порядке убывания . Кроме того, вы можете передать функцию сравнения в параметре «order» , чтобы определить собственную логику упорядочивания данных.Примечание. Этот метод следует использовать для простого массива. Если вы хотите отсортировать массив объектов, вам следует использовать метод sortBy(), описанный позже.
пример:
Допустим, вы хотите отсортировать данные «arr» . Вы можете сделать это следующим образом:
$ q = new Jsonq ();
$ res = $ q -> collect ([ 7 , 5 , 9 , 1 , 3 ])
-> sort ();
Подробный пример смотрите здесь.
sortBy(column, order)
column
— вам необходимо передать имя столбца, по которому будет выполняться сортировка.order
— если вы пропустите свойство «order», данные по умолчанию будут упорядочены по возрастанию . Вам нужно передать «desc» в качестве параметра «order» , чтобы отсортировать данные в порядке убывания . Кроме того, вы можете передать функцию сравнения в параметре «order» , чтобы определить собственную логику упорядочивания данных.Примечание. Этот метод следует использовать для массива объектов. Если вы хотите отсортировать простой массив, вам следует использовать метод sort(), описанный ранее.
пример:
Допустим, вы хотите отсортировать данные «цены» для «продуктов» . Вы можете сделать это следующим образом:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> sortBy ( ' price ' , ' desc ' );
Подробный пример смотрите здесь.
reset(data)
data
– это может быть путь к файлу JSON, строка JSON или объект JSON. Если в параметре data
не передано никаких данных, экземпляр объекта jsonQ
будет сброшен до ранее инициализированных данных.В любой момент вам может потребоваться сбросить экземпляр Object до совершенно другого набора данных, а затем выполнить запрос к ним. В этом случае вы можете использовать этот метод.
Подробный пример смотрите здесь.
copy()
Он вернет полную копию экземпляра объекта.
Подробный пример смотрите здесь.
Если у вас возникнут какие-либо ошибки или проблемы, смело открывайте проблему на github.
Кроме того, вы можете отправить мне электронное письмо на адрес mailto:[email protected], чтобы попросить об объятиях или ошибках.
Этот пакет также имеет другую языковую поддержку.
Эй, чувак! Помогите мне на пару!