JsonQ는 모든 유형의 JSON 데이터를 쿼리할 수 있는 간단하고 우아한 PHP 패키지입니다. JSON에 ORM과 유사한 쿼리를 제공하여 삶을 더 쉽게 만들어줄 것입니다.
안녕하세요. 이 프로젝트를 매일 개선할 수 있도록 도와주세요.
JsonQ 6.0 버전부터 모든 기능이 QAarray에서 다시 작성되었습니다. 오랜 시간이 지난 후에 우리는 JsonQ의 쿼리 엔진이 분리되어야 한다는 것을 깨달았습니다. 사람들은 CSV, YAML, XML과 같은 다양한 유형의 데이터를 쿼리하고 싶어하기 때문입니다. 따라서 쿼리 엔진을 이 프로젝트와 긴밀하게 연결하면 의미가 없습니다. 이것이 바로 우리가 쿼리 엔진 부분을 이동하고 새로운 패키지 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 , orWhere , 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
}
]
*/
쿼리된 결과의 가격 합계를 얻고 싶다고 가정해 보겠습니다. get() 대신 sum() 메서드를 호출하면 쉽게 할 수 있습니다.
$ 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 데이터의 '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()
메서드가 지정된 경로 계층 구조에서 데이터를 반환한다는 것입니다. 반면에 이 메서드는 Object 인스턴스를 반환하므로 이후에 쿼리 메서드를 추가로 연결할 수 있습니다.
예:
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
- 일치시킬 값입니다. op
에 따라 int , string , bool 또는 Function 일 수도 있습니다.
op
- 일치에 사용되는 피연산자입니다. 다음 피연산자를 사용할 수 있습니다.
=
: 약한 동등 매칭의 경우eq
: =
와 동일!=
: 약하고 동등하지 않은 일치의 경우neq
: !=
와 동일==
: 엄격한 동등 일치를 위해seq
: ==
와 동일!==
: 엄격하게 동등하지 않은 일치의 경우sneq
: !==
와 동일>
: 데이터에 주어진 키 의 값이 val 보다 큰지 확인합니다.gt
: 와 동일 >
<
: 데이터에 주어진 키 의 값이 val 보다 작은지 확인합니다.lt
: <
와 동일>=
: 데이터에서 주어진 키 의 값이 val 보다 크거나 같은지 확인합니다.gte
: >=
와 동일<=
: 데이터에서 주어진 키 의 값이 val 보다 작거나 같은지 확인합니다.lte
: <=
와 동일null
: 데이터의 지정된 키 값이 null 인지 확인합니다(이 op
에서는 where()
의 val
매개변수를 생략할 수 있음).notnull
: 데이터의 지정된 키 값이 null이 아닌지 확인합니다(이 op
에서는 where()
의 val
매개변수를 생략할 수 있음).in
: data의 주어진 키 값이 주어진 val 에 존재하는지 확인합니다. val은 일반 Array 여야 합니다.notin
: data의 주어진 키 값이 주어진 val 에 존재하지 않는지 확인합니다. val은 일반 Array 여야 합니다.startswith
: data의 주어진 키 값이 주어진 val 로 시작하는지(접두사가 있는지) 확인합니다. 이는 문자열 유형 데이터에만 작동합니다.endswith
: data의 주어진 키 값이 주어진 val 로 끝나는지(접미사가 있는지) 확인합니다. 이는 문자열 유형 데이터에만 작동합니다.contains
: data의 주어진 키 값에 주어진 val 의 하위 문자열이 있는지 확인합니다. 이는 문자열 유형 데이터에만 작동합니다.match
: 데이터의 주어진 키 값이 주어진 val 과 일치하는 정규식을 가지고 있는지 확인합니다. val
매개변수는 이 op
에 대한 RegExp 여야 합니다.macro
: 주어진 val
실행하는 데이터에서 주어진 키 의 값을 일치시키려고 시도합니다. val
매개변수는 이 op
에 대한 함수 여야 합니다. 이 함수는 내부에 일치하는 논리가 있어야 하며 이에 따라 true 또는 false를 반환해야 합니다.예:
id
1
인 '사용자'를 찾고 싶다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )-> where ( ' id ' , ' = ' , 1 )-> get ();
여러 개의 Where 조건을 추가할 수 있습니다. 이러한 여러 where 조건 사이를 AND로 연결하여 결과를 제공합니다.
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> where ( ' location ' , ' = ' , ' barisal ' )
-> get ();
여기에서 자세한 예를 확인하세요.
orWhere(key, op, val)
orWhere()
의 매개변수는 where()
와 동일합니다. where()
와 orWhere()
의 유일한 차이점은 orWhere()
메소드에 의해 제공된 조건이 결과를 다른 조건과 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
- 배열 이어야 합니다. 이 메서드는 where(key, 'in', val)
메서드 호출처럼 동작합니다.
whereNotIn(key, val)
key
- 데이터의 속성 이름val
- 배열 이어야 합니다. 이 메서드는 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
- 문자열이어야 합니다. 이 메서드는 where(key, 'startswith', val)
메서드 호출처럼 동작합니다.
whereEndsWith(key, val)
key
- 데이터의 속성 이름val
- 문자열이어야 합니다. 이 메서드는 where(key, 'endswith', val)
메서드 호출처럼 동작합니다.
whereContains(key, val)
key
- 데이터의 속성 이름val
- 문자열이어야 합니다. 이 메서드는 where(key, 'contains', val)
메서드 호출처럼 동작합니다.
sum(column)
column
- 데이터의 속성 이름예:
'제품' 의 '가격' 의 합을 구한다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ 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
- 데이터의 속성 이름예:
'제품' 의 '가격' 의 최대값을 찾고 싶다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
->max('price);
쿼리하는 데이터가 일반 배열인 경우 'column' 매개변수를 전달할 필요가 없습니다. 여기에서 자세한 예를 확인하세요.
min(column)
column
- 데이터의 속성 이름예:
'제품' '가격' 의 최소값을 찾고 싶다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> min ( ' price ' );
쿼리하는 데이터가 일반 배열인 경우 'property' 매개변수를 전달할 필요가 없습니다. 여기에서 자세한 예를 확인하세요.
avg(column)
column
- 데이터의 속성 이름예:
'제품' 의 '가격' 평균을 구한다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ 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()
요소가 비어 있지 않거나 null이 아니거나 빈 배열이 아니거나 빈 개체가 아닌 경우 true를 반환합니다.
예:
'products' 속성에 몇 개의 요소가 있는지 확인하고 싶다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ 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' 속성을 건너뛰면 데이터는 기본적으로 오름차순 으로 정렬됩니다. 데이터를 내림차순 으로 정렬하려면 'order' 매개변수로 'desc'를 전달해야 합니다. 또한 'order' 매개변수에 비교 함수를 전달하여 데이터 순서를 지정하는 고유한 논리를 정의할 수 있습니다.참고: 이 방법은 일반 배열에 사용해야 합니다. 객체 배열을 정렬하려면 나중에 설명하는 sortBy() 메서드를 사용해야 합니다.
예:
'arr' 데이터를 정렬하고 싶다고 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
$ q = new Jsonq ();
$ res = $ q -> collect ([ 7 , 5 , 9 , 1 , 3 ])
-> sort ();
여기에서 자세한 예를 확인하세요.
sortBy(column, order)
column
-- 정렬을 수행할 컬럼 이름을 전달해야 합니다.order
- 'order' 속성을 건너뛰면 데이터는 기본적으로 오름차순 으로 정렬됩니다. 데이터를 내림차순 으로 정렬하려면 '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
객체 인스턴스는 이전에 초기화된 데이터로 재설정됩니다.언제든지 Object 인스턴스를 완전히 다른 데이터 세트로 재설정한 다음 쿼리할 수 있습니다. 그럴때 이 방법을 사용하시면 됩니다.
여기에서 자세한 예를 확인하세요.
copy()
Object 인스턴스의 완전한 복제본을 반환합니다.
여기에서 자세한 예를 확인하세요.
버그나 문제가 발생하면 언제든지 github에서 문제를 공개하세요.
또한 포옹이나 버그에 대해 mailto:[email protected]으로 이메일을 보내실 수 있습니다.
이 패키지에는 다양한 언어 지원도 있습니다.
안녕 친구! 몇 분 동안 저를 도와주세요!