JsonQ عبارة عن حزمة PHP بسيطة وأنيقة للاستعلام عن أي نوع من بيانات JSON. سوف يجعل حياتك أسهل من خلال إعطاء نكهة استعلام يشبه ORM على JSON الخاص بك.
مرحبًا، الرجاء مساعدتي لتحسين هذا المشروع يوميًا
من الإصدار 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 ' ]);
يمكنك البدء في الاستعلام عن بياناتك باستخدام طرق الاستعلام المختلفة مثل البحث أو أين أو أين أو حيث يبدأ أو أين ينتهي مع أو أين يحتوي على وما إلى ذلك. يمكنك أيضًا تجميع بياناتك بعد الاستعلام باستخدام 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
*/
أنيق جدا، هاه؟
دعنا نستكشف واجهة برمجة التطبيقات الكاملة لنرى ما يمكن أن تقدمه لك هذه المكتبة من سحر. هلا فعلنا؟
يتم عرض أمثلة واجهة برمجة التطبيقات التالية بناءً على نموذج بيانات JSON الواردة هنا. للحصول على فكرة أفضل عن الأمثلة، راجع بيانات JSON أولاً. يمكنك أيضًا العثور على أمثلة تفصيلية لكل واجهة برمجة تطبيقات هنا.
قائمة واجهة برمجة التطبيقات:
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
أو إعطاء "." كمعلمة ستبدأ أيضًا الاستعلام من البيانات الجذرية.
الفرق بين هذه الطريقة و find()
هو أن طريقة find()
ستعيد البيانات من التسلسل الهرمي للمسار المحدد. من ناحية أخرى، ستعيد هذه الطريقة نسخة الكائن، بحيث يمكنك متابعة طرق الاستعلام المتسلسلة بعدها.
مثال:
لنفترض أنك تريد بدء الاستعلام عن قيم خاصية "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 أو حتى function - اعتمادًا على op
.
op
- المعامل الذي سيتم استخدامه للمطابقة. المعاملات التالية متاحة للاستخدام:
=
: لمطابقة المساواة الضعيفةeq
: نفس =
!=
: للضعفاء وليس المساواة المطابقةneq
: نفس !=
==
: لمطابقة المساواة الصارمةseq
: نفس ==
!==
: للمطابقة الصارمة وليس المساواةsneq
: نفس !==
>
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات أكبر من valgt
: نفس >
<
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات أقل من vallt
: نفس <
>=
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات أكبر من أو تساوي القيمةgte
: نفس >=
<=
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات أقل من أو تساوي القيمةlte
: نفس <=
null
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات فارغة (يمكن حذف معلمة val
where()
لهذه op
)notnull
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات ليست فارغة (يمكن حذف المعلمة val
where()
لهذه op
)in
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات موجودة في القيمة المحددة. يجب أن يكون val مصفوفة عادية.notin
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات غير موجودة في القيمة المحددة. يجب أن يكون val مصفوفة عادية.startswith
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات تبدأ بـ (تحتوي على بادئة) val المحدد. هذا من شأنه أن يعمل فقط مع بيانات نوع السلسلة .endswith
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات تنتهي بـ (تحتوي على لاحقة) للقيمة المحددة. هذا من شأنه أن يعمل فقط مع بيانات نوع السلسلة .contains
: التحقق مما إذا كانت قيمة المفتاح المحدد في البيانات تحتوي على سلسلة فرعية من القيمة المحددة. هذا من شأنه أن يعمل فقط مع بيانات نوع السلسلة .match
: تحقق مما إذا كانت قيمة المفتاح المحدد في البيانات تحتوي على تطابق التعبير العادي مع القيمة المحددة. يجب أن تكون المعلمة val
RegExp لهذا op
.macro
: سيحاول مطابقة قيمة المفتاح المحدد في البيانات التي تنفذ val
المحددة. يجب أن تكون المعلمة val
دالة لهذا op
. يجب أن تحتوي هذه الوظيفة على منطق مطابق بداخلها وترجع صحيحًا أو خطأ بناءً على ذلك.مثال:
لنفترض أنك تريد العثور على "المستخدمين" الذين لديهم id
1
. يمكنك القيام بذلك على النحو التالي:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )-> where ( ' id ' , ' = ' , 1 )-> get ();
يمكنك إضافة شروط متعددة. سوف يعطي النتيجة عن طريق AND-ing بين هذه الشروط المتعددة.
$ 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()
سوف يقوم بتعديل النتيجة بشروط أخرى.
على سبيل المثال، إذا كنت تريد العثور على المستخدمين ذوي المعرف 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 ' );
إذا كانت البيانات التي تقوم بتجميعها عبارة عن مصفوفة عادية، فلن تحتاج إلى تمرير معلمة "العمود". انظر المثال التفصيلي هنا
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()
سيعود صحيحًا إذا كان العنصر ليس فارغًا أو ليس فارغًا أو ليس مصفوفة فارغة أو ليس كائنًا فارغًا .
مثال:
لنفترض أنك تريد معرفة عدد العناصر الموجودة في خاصية "المنتجات" . يمكنك القيام بذلك مثل:
$ 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" لفرز البيانات بترتيب تنازلي . يمكنك أيضًا تمرير وظيفة مقارنة في معلمة "الترتيب" لتحديد المنطق الخاص بك لترتيب البيانات.ملاحظة: يجب استخدام هذه الطريقة للمصفوفة العادية. إذا كنت تريد فرز مصفوفة من الكائنات، فيجب عليك استخدام طريقة sortBy() الموضحة لاحقًا.
مثال:
لنفترض أنك تريد فرز البيانات "arr" . يمكنك القيام بذلك مثل:
$ q = new Jsonq ();
$ res = $ q -> collect ([ 7 , 5 , 9 , 1 , 3 ])
-> sort ();
انظر المثال التفصيلي هنا.
sortBy(column, order)
column
- يجب عليك تمرير اسم العمود الذي سيتم الفرز عليه.order
- إذا تخطيت خاصية "order" فسيتم ترتيب البيانات افتراضيًا على أنها تصاعدية . تحتاج إلى تمرير "desc" كمعلمة "order" لفرز البيانات بترتيب تنازلي . يمكنك أيضًا تمرير وظيفة مقارنة في معلمة "الترتيب" لتحديد المنطق الخاص بك لترتيب البيانات.ملاحظة: يجب استخدام هذه الطريقة لمصفوفة الكائنات. إذا كنت تريد فرز مصفوفة عادية، فيجب عليك استخدام طريقة الفرز () الموضحة سابقًا.
مثال:
لنفترض أنك تريد فرز بيانات "السعر" الخاصة بـ "المنتجات" . يمكنك القيام بذلك مثل:
$ 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:[email protected] بخصوص العناق أو الأخطاء.
تحتوي هذه الحزمة أيضًا على دعم لغة مختلف.
يا المتأنق! ساعدوني لبضعة!