JsonQ é um pacote PHP simples e elegante para consultar qualquer tipo de dados JSON. Isso tornará sua vida mais fácil, dando o sabor de uma consulta semelhante a ORM em seu JSON.
Olá, por favor me ajude a melhorar diariamente este projeto
A partir da versão JsonQ 6.0 todos os recursos foram reescritos do QAarray. Depois de um longo período, percebemos que o Query Engine do JsonQ deveria ser separado. Porque as pessoas desejam consultar vários tipos de dados, como CSV, YAML, XML. Portanto, se mantivermos o mecanismo de consulta fortemente acoplado a este projeto, não fará sentido. É por isso que movemos a parte do Query Engine e desenvolvemos um novo pacote QAarray. Qarray foi projetado para consultar array PHP nativo e qualquer pessoa pode implementar seu próprio mecanismo, como JsonQ.
Por favor, não atualize para a versão >= 6.0 diretamente abaixo
composer require nahid/jsonq
Você pode começar a usar este pacote imediatamente importando seus dados JSON de um arquivo:
use Nahid /JsonQ/Jsonq;
$ jsonq = new Jsonq ( ' data.json ' );
Ou de uma string JSON:
$ json -> json ( ' {"id": 1, "name": "Nahid"} ' );
Ou de um array PHP:
$ json -> collect ([ ' id ' => 1 , ' name ' => ' Nahid ' ]);
Você pode começar a consultar seus dados usando vários métodos de consulta, como find , where , orWhere , whereIn , whereStartsWith , whereEndsWith , whereContains e assim por diante. Além disso, você pode agregar seus dados após a consulta usando sum , count , groupBy , max , min etc.
Vejamos um exemplo rápido:
//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
}
]
*/
Digamos que queremos obter a soma do preço do resultado consultado. Podemos fazer isso facilmente chamando o método sum() em vez de get() :
$ result = $ json -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 2 )
-> sum ( ' price ' );
dump ( $ result );
//It will print:
/*
365000
*/
Muito legal, hein?
Vamos explorar a API completa para ver o que mais essa biblioteca pode fazer por você. Devemos nós?
Os exemplos de API a seguir são mostrados com base nos dados JSON de amostra fornecidos aqui. Para ter uma ideia melhor dos exemplos, veja primeiro os dados JSON. Exemplos detalhados de cada API também podem ser encontrados aqui.
Lista de APIs:
fetch()
Este método executará consultas e retornará os dados resultantes. Você precisa chamá-lo finalmente depois de usar alguns métodos de consulta. Detalhes podem ser encontrados em outros exemplos de API.
find(path)
path
- a hierarquia de caminhos dos dados que você deseja encontrar. Você não precisa chamar o método fetch()
depois disso. Porque este método irá buscar e retornar os dados por si só.
advertência: você não pode encadear outros métodos de consulta depois dele. Se precisar disso, você deve usar o método at()
ou from()
.
exemplo:
Digamos que você queira obter o valor da propriedade 'cidades' dos seus dados Json. Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> find ( ' vendor.name ' );
Se você quiser ir mais fundo na hierarquia, você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> find ( ' vendor.name ' );
Veja um exemplo detalhado aqui.
from(path)
path
(opcional) – a hierarquia de caminhos dos dados a partir dos quais você deseja iniciar a consulta. Por padrão, a consulta seria iniciada na raiz dos dados JSON que você forneceu. Se você quiser primeiro passar para uma hierarquia de caminhos aninhados dos dados de onde deseja iniciar sua consulta, você usaria este método. Ignorando o parâmetro path
ou fornecendo '.' como parâmetro também iniciará a consulta a partir dos dados raiz.
A diferença entre este método e find()
é que o método find()
retornará os dados de uma determinada hierarquia de caminhos. Por outro lado, este método retornará a instância Object, para que você possa encadear métodos de consulta posteriormente.
exemplo:
Digamos que você queira iniciar uma consulta sobre os valores da propriedade 'vendor.name' de seus dados JSON. Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> from ( ' vendor.name ' )-> get ();
Se você quiser ir mais fundo na hierarquia, você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> from ( ' users.5.visits ' )-> get ();
Veja um exemplo detalhado aqui.
at(path)
Este é um método alternativo de from()
e se comportará exatamente assim. Veja exemplo aqui.
where(key, condition, val)
key
– o nome da propriedade dos dados. Ou você pode passar uma função aqui para agrupar várias consultas dentro dela. Veja detalhes no exemplo
val
– valor a ser correspondido. Pode ser um int , string , bool ou até Function - dependendo da op
.
op
-- operando a ser usado para correspondência. Os seguintes operandos estão disponíveis para uso:
=
: Para correspondência de igualdade fracaeq
: O mesmo que =
!=
: Para correspondência fraca e não de igualdadeneq
: O mesmo que !=
==
: Para correspondência de igualdade estritaseq
: O mesmo que ==
!==
: Para correspondência estrita e não de igualdadesneq
: O mesmo que !==
>
: Verifique se o valor de determinada chave nos dados é maior que valgt
: O mesmo que >
<
: Verifique se o valor de determinada chave nos dados é menor que vallt
: O mesmo que <
>=
: Verifique se o valor de determinada chave nos dados é maior ou igual a valgte
: O mesmo que >=
<=
: Verifique se o valor de determinada chave nos dados é menor ou igual a vallte
: O mesmo que <=
null
: verifica se o valor de determinada chave nos dados é nulo (o parâmetro val
em where()
pode ser omitido para esta op
)notnull
: verifica se o valor da chave fornecida nos dados não é nulo (o parâmetro val
em where()
pode ser omitido para esta op
)in
: verifica se o valor de determinada chave em data existe em determinado val . val deve ser um Array simples.notin
: Verifique se o valor de determinada chave em data não existe em determinado val . val deve ser um Array simples.startswith
: verifica se o valor da chave fornecida nos dados começa com (tem um prefixo) o val fornecido. Isso funcionaria apenas para dados do tipo String .endswith
: verifica se o valor de determinada chave em data termina com (tem um sufixo) o determinado val . Isso funcionaria apenas para dados do tipo String .contains
: verifica se o valor de determinada chave em data possui uma substring de determinado val . Isso funcionaria apenas para dados do tipo String .match
: Verifique se o valor de determinada chave nos dados tem uma correspondência de Expressão Regular com o val fornecido. O parâmetro val
deve ser um RegExp para esta op
.macro
: tentaria corresponder ao valor de determinada chave nos dados que executam o val
fornecido. O parâmetro val
deve ser uma função para esta op
. Esta função deve ter uma lógica correspondente dentro dela e retornar verdadeiro ou falso com base nisso.exemplo:
Digamos que você queira encontrar os 'usuários' que possuem id
1
. Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )-> where ( ' id ' , ' = ' , 1 )-> get ();
Você pode adicionar várias condições where . Ele fornecerá o resultado por meio de AND entre essas múltiplas condições where.
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> where ( ' location ' , ' = ' , ' barisal ' )
-> get ();
Veja um exemplo detalhado aqui.
orWhere(key, op, val)
Os parâmetros de orWhere()
são iguais a where()
. A única diferença entre where()
e orWhere()
é: a condição dada pelo método orWhere()
fará o OR do resultado com outras condições.
Por exemplo, se você deseja encontrar os usuários com id 1
ou 2
, você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> orWhere ( ' id ' , ' = ' , 2 )
-> get ();
Veja exemplo detalhado aqui.
whereIn(key, val)
key
– o nome da propriedade dos dadosval
- deve ser um array Este método se comportará como uma chamada de método where(key, 'in', val)
.
whereNotIn(key, val)
key
– o nome da propriedade dos dadosval
- deve ser um array Este método se comportará como uma chamada de método where(key, 'notin', val)
.
whereNull(key)
key
– o nome da propriedade dos dados Este método se comportará como uma chamada de método where(key, 'null')
ou where(key, '=', null)
.
whereNotNull(key)
key
– o nome da propriedade dos dados Este método se comportará como uma chamada de método where(key, 'notnull')
ou where(key, '!=', null)
.
whereStartsWith(key, val)
key
– o nome da propriedade dos dadosval
- deve ser uma String Este método se comportará como uma chamada de método where(key, 'startswith', val)
.
whereEndsWith(key, val)
key
– o nome da propriedade dos dadosval
- deve ser uma String Este método se comportará como uma chamada de método where(key, 'endswith', val)
.
whereContains(key, val)
key
– o nome da propriedade dos dadosval
- deve ser uma String Este método se comportará como uma chamada de método where(key, 'contains', val)
.
sum(column)
column
- o nome da propriedade dos dadosexemplo:
Digamos que você queira encontrar a soma do ‘preço’ dos ‘produtos’ . Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> sum ( ' price ' );
Se os dados que você está agregando forem uma matriz simples, não será necessário passar o parâmetro 'coluna'. Veja exemplo detalhado aqui
count()
Ele retornará o número de elementos da coleção.
exemplo:
Digamos que você queira descobrir quantos elementos existem na propriedade ‘produtos’ . Você pode fazer isso como:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> count ();
Veja exemplo detalhado aqui.
size()
Este é um método alternativo de count()
.
max(column)
column
- o nome da propriedade dos dadosexemplo:
Digamos que você queira encontrar o máximo do ‘preço’ dos ‘produtos’ . Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
->max('price);
Se os dados que você está consultando forem um array simples, você não precisa passar o parâmetro 'coluna'. Veja exemplo detalhado aqui
min(column)
column
- o nome da propriedade dos dadosexemplo:
Digamos que você queira encontrar o mínimo do ‘preço’ dos ‘produtos’ . Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> min ( ' price ' );
Se os dados que você está consultando forem um array simples, você não precisa passar o parâmetro 'property'. Veja exemplo detalhado aqui
avg(column)
column
- o nome da propriedade dos dadosexemplo:
Digamos que você queira encontrar a média do ‘preço’ dos ‘produtos’ . Você pode fazer assim:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> avg ( ' price ' );
Se os dados que você está consultando forem um array simples, você não precisa passar o parâmetro 'coluna'. Veja exemplo detalhado aqui
first()
Ele retornará o primeiro elemento da coleção.
exemplo:
$ q = new jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> first ();
Veja exemplo detalhado aqui.
last()
Ele retornará o último elemento da coleção.
exemplo:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> last ();
Veja exemplo detalhado aqui.
nth(index)
index
- índice do elemento a ser retornado.Ele retornará o enésimo elemento da coleção. Se o índice fornecido for um valor positivo , ele retornará o enésimo elemento desde o início. Se o índice fornecido for um valor negativo , ele retornará o enésimo elemento do final.
exemplo:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> nth ( 2 );
Veja exemplo detalhado aqui.
exists()
Ele retornará verdadeiro se o elemento não estiver vazio ou não for nulo ou não for um array vazio ou não for um objeto vazio .
exemplo:
Digamos que você queira descobrir quantos elementos existem na propriedade ‘produtos’ . Você pode fazer isso como:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> exists ();
Veja exemplo detalhado aqui.
groupBy(column)
column
– A propriedade pela qual você deseja agrupar a coleção.exemplo:
Digamos que você queira agrupar os dados dos ‘usuários’ com base na propriedade ‘local’ . Você pode fazer isso como:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> groupBy ( ' location ' )
-> get ();
Veja exemplo detalhado aqui.
sort(order)
order
- Se você pular a propriedade 'order', os dados serão ordenados por padrão em ordem crescente . Você precisa passar 'desc' como parâmetro 'order' para classificar os dados em ordem decrescente . Além disso, você pode passar uma função de comparação no parâmetro 'order' para definir sua própria lógica para ordenar os dados.Nota: Este método deve ser usado para Array simples. Se você deseja classificar um array de objetos, você deve usar o método sortBy() descrito posteriormente.
exemplo:
Digamos que você queira classificar os dados 'arr' . Você pode fazer isso como:
$ q = new Jsonq ();
$ res = $ q -> collect ([ 7 , 5 , 9 , 1 , 3 ])
-> sort ();
Veja exemplo detalhado aqui.
sortBy(column, order)
column
- Você precisa passar o nome da coluna na qual será feita a ordenação.order
- Se você pular a propriedade 'order', os dados serão ordenados por padrão em ordem crescente . Você precisa passar 'desc' como parâmetro 'order' para classificar os dados em ordem decrescente . Além disso, você pode passar uma função de comparação no parâmetro 'order' para definir sua própria lógica para ordenar os dados.Nota: Este método deve ser usado para Array of Objects. Se você deseja classificar um Array simples, você deve usar o método sort() descrito anteriormente.
exemplo:
Digamos que você queira classificar os dados de ‘preço’ de ‘produtos’ . Você pode fazer isso como:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> sortBy ( ' price ' , ' desc ' );
Veja exemplo detalhado aqui.
reset(data)
data
- pode ser um caminho de arquivo JSON, uma string JSON ou um objeto JSON. Se nenhum dado for passado no parâmetro data
, a instância do objeto jsonQ
será redefinida para os dados inicializados anteriormente.A qualquer momento, você pode querer redefinir a instância do Object para um conjunto de dados completamente diferente e depois consultá-lo. Você pode usar este método nesse caso.
Veja um exemplo detalhado aqui.
copy()
Ele retornará um clone completo da instância do Object.
Veja um exemplo detalhado aqui.
Se você encontrar algum bug ou problema, sinta-se à vontade para abrir um problema no github.
Além disso, você pode me enviar um e-mail para mailto:[email protected] para abraços ou bugs.
Este pacote também possui suporte a diferentes idiomas.
Ei cara! Me ajude por alguns!