• Stars
    star
    870
  • Rank 52,440 (Top 2 %)
  • Language
    PHP
  • License
    Creative Commons ...
  • Created over 8 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A PHP query builder for JSON

php-jsonq

JsonQ is a simple, elegant PHP package to Query over any type of JSON Data. It'll make your life easier by giving the flavour of an ORM-like query on your JSON.

Support For This Project

Hey due, please help me out for daily improve this project

Beerpay

NOTE

From the version JsonQ 6.0 all the features rewrite from QAarray. After a long run we noticed that Query Engine of JsonQ should be seperate. Becouse people want to query over various types of data like CSV, YAML, XML. So if we keep the query engine tightly coupled with this project its make no sense. Thats why we move the Query Engine part and develop a new package QAarray. Qarray is designed for queryng over native PHP array and anyone can implement their own Engine, like JsonQ.

Please do not update to >= 6.0 version directly from bellow

Installation

composer require nahid/jsonq

Usage

You can start using this package right away by importing your JSON data from a file:

use Nahid/JsonQ/Jsonq;
$jsonq = new Jsonq('data.json');

Or from a JSON String:

$json->json('{"id": 1, "name": "Nahid"}');

Or from a PHP Array:

$json->collect(['id'=>1, 'name'=>'Nahid']);

You can start Query your data using the various query methods such as find, where, orWhere, whereIn, whereStartsWith, whereEndsWith, whereContains and so on. Also you can aggregate your data after query using sum, count, groupBy, max, min etc.

Let's see a quick example:

//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
  }
]
*/

Let's say we want to get the Summation of price of the Queried result. We can do it easily by calling the sum() method instead of get():

$result = $json->from('products')
        ->where('cat', '=', 2)
        ->sum('price');
dump($result);

//It will print:
/*
365000
*/

Pretty neat, huh?

Let's explore the full API to see what else magic this library can do for you. Shall we?

API

Following API examples are shown based on the sample JSON data given here. To get a better idea of the examples see that JSON data first. Also detailed examples of each API can be found here.

List of API:

fetch()

This method will execute queries and will return the resulted data. You need to call it finally after using some query methods. Details can be found in other API examples.

find(path)

  • path -- the path hierarchy of the data you want to find.

You don't need to call fetch() method after this. Because this method will fetch and return the data by itself.

caveat: You can't chain further query methods after it. If you need that, you should use at() or from() method.

example:

Let's say you want to get the value of 'cities' property of your Json Data. You can do it like this:

$q = new Jsonq('data.json');
echo $q->find('vendor.name');

If you want to traverse to more deep in hierarchy, you can do it like:

$q = new Jsonq('data.json');
echo $q->find('vendor.name');

See a detail example here.

from(path)

  • path (optional) -- the path hierarchy of the data you want to start query from.

By default, query would be started from the root of the JSON Data you've given. If you want to first move to a nested path hierarchy of the data from where you want to start your query, you would use this method. Skipping the path parameter or giving '.' as parameter will also start query from the root Data.

Difference between this method and find() is that, find() method will return the data from the given path hierarchy. On the other hand, this method will return the Object instance, so that you can further chain query methods after it.

example:

Let's say you want to start query over the values of 'vendor.name' property of your JSON Data. You can do it like this:

$q = new Jsonq('data.json');
echo $q->from('vendor.name')->get();

If you want to traverse to more deep in hierarchy, you can do it like:

$q = new Jsonq('data.json');
echo $q->from('users.5.visits')->get();

See a detail example here.

at(path)

This is an alias method of from() and will behave exactly like that. See example here.

where(key, condition, val)

  • key -- the property name of the data. Or you can pass a Function here to group multiple query inside it. See details in example

  • val -- value to be matched with. It can be a int, string, bool or even Function - depending on the op.

  • op -- operand to be used for matching. The following operands are available to use:

    • = : For weak equality matching
    • eq : Same as =
    • != : For weak not equality matching
    • neq : Same as !=
    • == : For strict equality matching
    • seq : Same as ==
    • !== : For strict not equality matching
    • sneq : Same as !==
    • > : Check if value of given key in data is Greater than val
    • gt : Same as >
    • < : Check if value of given key in data is Less than val
    • lt : Same as <
    • >= : Check if value of given key in data is Greater than or Equal of val
    • gte : Same as >=
    • <= : Check if value of given key in data is Less than or Equal of val
    • lte : Same as <=
    • null : Check if the value of given key in data is null (val parameter in where() can be omitted for this op)
    • notnull : Check if the value of given key in data is not null (val parameter in where() can be omitted for this op)
    • in : Check if the value of given key in data is exists in given val. val should be a plain Array.
    • notin : Check if the value of given key in data is not exists in given val. val should be a plain Array.
    • startswith : Check if the value of given key in data starts with (has a prefix of) the given val. This would only works for String type data.
    • endswith : Check if the value of given key in data ends with (has a suffix of) the given val. This would only works for String type data.
    • contains : Check if the value of given key in data has a substring of given val. This would only works for String type data.
    • match : Check if the value of given key in data has a Regular Expression match with the given val. The val parameter should be a RegExp for this op.
    • macro : It would try to match the value of given key in data executing the given val. The val parameter should be a Function for this op. This function should have a matching logic inside it and return true or false based on that.

example:

Let's say you want to find the 'users' who has id of 1. You can do it like this:

$q = new Jsonq('data.json');
$res = $q->from('users')->where('id', '=', 1)->get();

You can add multiple where conditions. It'll give the result by AND-ing between these multiple where conditions.

$q = new Jsonq('data.json');
$res = $q->from('users')
->where('id', '=', 1)
->where('location', '=', 'barisal')
->get();

See a detail example here.

orWhere(key, op, val)

Parameters of orWhere() are the same as where(). The only difference between where() and orWhere() is: condition given by the orWhere() method will OR-ed the result with other conditions.

For example, if you want to find the users with id of 1 or 2, you can do it like this:

$q = new Jsonq('data.json');
$res = $q->from('users')
->where('id', '=', 1)
->orWhere('id', '=', 2)
->get();

See detail example here.

whereIn(key, val)

  • key -- the property name of the data
  • val -- it should be an Array

This method will behave like where(key, 'in', val) method call.

whereNotIn(key, val)

  • key -- the property name of the data
  • val -- it should be an Array

This method will behave like where(key, 'notin', val) method call.

whereNull(key)

  • key -- the property name of the data

This method will behave like where(key, 'null') or where(key, '=', null) method call.

whereNotNull(key)

  • key -- the property name of the data

This method will behave like where(key, 'notnull') or where(key, '!=', null) method call.

whereStartsWith(key, val)

  • key -- the property name of the data
  • val -- it should be a String

This method will behave like where(key, 'startswith', val) method call.

whereEndsWith(key, val)

  • key -- the property name of the data
  • val -- it should be a String

This method will behave like where(key, 'endswith', val) method call.

whereContains(key, val)

  • key -- the property name of the data
  • val -- it should be a String

This method will behave like where(key, 'contains', val) method call.

sum(column)

  • column -- the property name of the data

example:

Let's say you want to find the sum of the 'price' of the 'products'. You can do it like this:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->sum('price');

If the data you are aggregating is plain array, you don't need to pass the 'column' parameter. See detail example here

count()

It will return the number of elements in the collection.

example:

Let's say you want to find how many elements are in the 'products' property. You can do it like:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->count();

See detail example here.

size()

This is an alias method of count().

max(column)

  • column -- the property name of the data

example:

Let's say you want to find the maximum of the 'price' of the 'products'. You can do it like this:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->max('price);

If the data you are querying is plain array, you don't need to pass the 'column' parameter. See detail example here

min(column)

  • column -- the property name of the data

example:

Let's say you want to find the minimum of the 'price' of the 'products'. You can do it like this:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->min('price');

If the data you are querying is plain array, you don't need to pass the 'property' parameter. See detail example here

avg(column)

  • column -- the property name of the data

example:

Let's say you want to find the average of the 'price' of the 'products'. You can do it like this:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->avg('price');

If the data you are querying is plain array, you don't need to pass the 'column' parameter. See detail example here

first()

It will return the first element of the collection.

example:

$q = new jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->first();

See detail example here.

last()

It will return the last element of the collection.

example:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->last();

See detail example here.

nth(index)

  • index -- index of the element to be returned.

It will return the nth element of the collection. If the given index is a positive value, it will return the nth element from the beginning. If the given index is a negative value, it will return the nth element from the end.

example:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->nth(2);

See detail example here.

exists()

It will return true if the element is not empty or not null or not an empty array or not an empty object.

example:

Let's say you want to find how many elements are in the 'products' property. You can do it like:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->exists();

See detail example here.

groupBy(column)

  • column -- The property by which you want to group the collection.

example:

Let's say you want to group the 'users' data based on the 'location' property. You can do it like:

$q = new Jsonq('data.json');
$res = $q->from('users')
->groupBy('location')
->get();

See detail example here.

sort(order)

  • order -- If you skip the 'order' property the data will be by default ordered as ascending. You need to pass 'desc' as the 'order' parameter to sort the data in descending order. Also, you can pass a compare function in 'order' parameter to define your own logic to order the data.

Note: This method should be used for plain Array. If you want to sort an Array of Objects you should use the sortBy() method described later.

example:

Let's say you want to sort the 'arr' data. You can do it like:

$q = new Jsonq();
$res = $q->collect([7, 5, 9, 1, 3])
->sort();

See detail example here.

sortBy(column, order)

  • column -- You need to pass the column name on which the sorting will be done.
  • order -- If you skip the 'order' property the data will be by default ordered as ascending. You need to pass 'desc' as the 'order' parameter to sort the data in descending order. Also, you can pass a compare function in 'order' parameter to define your own logic to order the data.

Note: This method should be used for Array of Objects. If you want to sort a plain Array you should use the sort() method described earlier.

example:

Let's say you want to sort the 'price' data of 'products'. You can do it like:

$q = new Jsonq('data.json');
$res = $q->from('products')
->where('cat', '=', 1)
->sortBy('price', 'desc');

See detail example here.

reset(data)

  • data -- can be a JSON file path, or a JSON string or a JSON Object. If no data passed in the data parameter, the jsonQ Object instance will be reset to previously initialized data.

At any point, you might want to reset the Object instance to a completely different set of data and then query over it. You can use this method in that case.

See a detail example here.

copy()

It will return a complete clone of the Object instance.

See a detail example here.

Bugs and Issues

If you encounter any bugs or issues, feel free to open an issue at github.

Also, you can shoot me an email to mailto:[email protected] for hugs or bugs.

Others Platform

This package has also different language support.

Support on Beerpay

Hey dude! Help me out for a couple of 🍻!

Beerpay Beerpay

More Repositories

1

talk

Talk is a real-time users messaging and chatting system for Laravel.
PHP
1,608
star
2

talk-example

This project is demo for Laravel-Talk package and its also Docker ready
PHP
131
star
3

qarray

A Query Engine For PHP Array
PHP
102
star
4

presento

Presento - Transformer & Presenter Package for PHP
PHP
73
star
5

permit

A laravel package to handle user authorization and ACL
PHP
71
star
6

gohttp

HTTP client for Go
Go
63
star
7

apiz

APIZ is a PHP HTTP client development kit
PHP
58
star
8

hookr

PHP action and filter hook system
PHP
41
star
9

envato-php

PHP client for envato API
PHP
30
star
10

nahid.co

This is a personal portfolio and blog project based on Laravel 5.1.
JavaScript
25
star
11

js-progressive-image-loader

Progressive image loader extended from https://github.com/zafree/pilpil
JavaScript
19
star
12

url-factory

UrlFactory help you to manage URL.
PHP
18
star
13

Absolute-PHP

Absolute PHP - A complete php learning book in bangla
12
star
14

imapx

imapx is php library for laravel 5. Its retrieve all emails from server via imap or pop
PHP
11
star
15

linkify

Converts URLs and email addresses in text into HTML links its extended from Misd\Linify its also support laravel 5
PHP
11
star
16

php-sslwireless-sms

php-sslwireless-sms is a PHP client for SSL Wirless SMS API
PHP
9
star
17

facebot

Facebot is a Facebook Chat Bot PHP framework
PHP
7
star
18

framework-x-starter

A boilerplate code for Framework X
PHP
7
star
19

php-github-client

Github client for PHP
PHP
6
star
20

crudx

PHP
6
star
21

gorrors

Go package for handling repetitive errors
Go
5
star
22

laravel-workshop-project

laravel project for workshop "a day with laravel" in HubDhaka by HellloStar
JavaScript
4
star
23

laravel-blog

A simple personal blog application written by Laravel
HTML
4
star
24

php-stack-api

You can access and manage stackexchange api with this package
PHP
4
star
25

popo

POPO(Plain Old PHP Object) is an Entity based PHP package
PHP
3
star
26

imagex

Image Handling Library for Laravel 4
PHP
3
star
27

alien-diary

Personal Blogging Site
Dockerfile
3
star
28

gotee

A microframework for PHP
PHP
3
star
29

errorbag

A PHP package to contain and manage errors
PHP
3
star
30

php7-clan-a

PHP 7 Course - Example Code
PHP
2
star
31

dribbble-php-client

Its a php client for dribbble
PHP
2
star
32

jsonx

JSONS is a PHP based class to manipulate json file and its data
PHP
2
star
33

appxpo

PHP project explorer
CSS
2
star
34

larasy

its a modern CMS using latest laravel 5
PHP
2
star
35

literature

A fun project for making code literature
PHP
2
star
36

phpew

PHPew is a nonMVC Nano framework
PHP
2
star
37

DotNetLearners

C#
2
star
38

validx

Validx is PHP based library for form validation
PHP
1
star
39

useful-regex

1
star
40

php-unique-multiple-random-number

Its a PHP function for generate unique multiple random number as an array.
PHP
1
star
41

imgurx

Imgur Laravel supported package based on Adyg/php-imgur-api-client.
PHP
1
star
42

laraTodo

A simple todo app developed with Laravel 5.2
CSS
1
star