تسمح لك حزمة Laravel هذه بالبحث في نماذج Eloquent المتعددة. وهو يدعم الفرز، وترقيم الصفحات، والاستعلامات المحددة النطاق، وعلاقات التحميل المتلهفة، والبحث من خلال أعمدة مفردة أو متعددة.
❤️ نحن ندعم المجتمع بفخر من خلال تطوير حزم Laravel ومنحها مجانًا. إذا كانت هذه الحزمة توفر لك الوقت أو إذا كنت تعتمد عليها بشكل احترافي، فيرجى التفكير في رعاية الصيانة والتطوير والاطلاع على أحدث باقة متميزة لدينا: Inertia Table. يستغرق تتبع المشكلات وطلبات السحب وقتًا، ولكن يسعدنا تقديم المساعدة!
إذا كنت تريد معرفة المزيد عن خلفية هذه الحزمة، يرجى قراءة منشور المدونة.
يمكنك تثبيت الحزمة عبر الملحن:
composer require protonemedia/laravel-cross-eloquent-search
get
على search
.addWhen
لصالح when
.updated_at
في معظم الحالات. إذا كنت لا تستخدم الطوابع الزمنية، فسوف يستخدم المفتاح الأساسي الآن بشكل افتراضي. startWithWildcard
إلى beginWithWildcard
.getUpdatedAtColumn
. في السابق كان يتم ترميزه بشكل ثابت إلى updated_at
. لا يزال بإمكانك استخدام عمود آخر للترتيب حسبه.allowEmptySearchQuery
وفئة EmptySearchQueryException
، ولكن لا يزال بإمكانك الحصول على النتائج دون البحث. ابدأ استعلام البحث الخاص بك عن طريق إضافة نموذج واحد أو أكثر للبحث فيه. اتصل بطريقة add
باسم فئة النموذج والعمود الذي تريد البحث فيه. ثم اتصل بطريقة search
باستخدام مصطلح البحث، وستحصل على مثيل IlluminateDatabaseEloquentCollection
مع النتائج.
يتم فرز النتائج بترتيب تصاعدي حسب العمود المحدث افتراضيًا. في معظم الحالات، يتم updated_at
هذا العمود. إذا قمت بتخصيص ثابت UPDATED_AT
الخاص بنموذجك، أو قمت باستبدال طريقة getUpdatedAtColumn
، فستستخدم هذه الحزمة العمود المخصص. إذا كنت لا تستخدم الطوابع الزمنية على الإطلاق، فسوف يستخدم المفتاح الأساسي بشكل افتراضي. بالطبع، يمكنك الطلب حسب عمود آخر أيضًا.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
إذا كنت تهتم بالمسافة البادئة، فيمكنك اختياريًا استخدام الطريقة new
على الواجهة:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
هناك أيضًا طريقة when
لتطبيق بنود معينة بناءً على شرط آخر:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
افتراضيًا، نقوم بتقسيم مصطلح البحث، وستحصل كل كلمة رئيسية على رمز بدل لإجراء مطابقة جزئية. ويعني هذا عمليًا أن مصطلح البحث apple ios
سينتج عنه apple%
و ios%
. إذا كنت تريد أن يبدأ رمز حرف البدل أيضًا، فيمكنك استدعاء الأسلوب beginWithWildcard
. سيؤدي هذا إلى %apple%
و %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
ملاحظة: في الإصدارات السابقة من هذه الحزمة، كانت هذه الطريقة تسمى startWithWildcard()
.
إذا كنت تريد تعطيل السلوك الذي يتم فيه إلحاق حرف البدل بالمصطلحات، فيجب عليك استدعاء التابع endWithWildcard
false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
يتم دعم البحث متعدد الكلمات خارج الصندوق. ما عليك سوى لف عبارتك في علامتي اقتباس مزدوجتين.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
يمكنك تعطيل تحليل مصطلح البحث عن طريق استدعاء الأسلوب dontParseTerm
، والذي يمنحك نفس النتائج مثل استخدام علامات الاقتباس المزدوجة.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
إذا كنت تريد فرز النتائج حسب عمود آخر، فيمكنك تمرير هذا العمود إلى طريقة add
كمعلمة ثالثة. قم باستدعاء الأسلوب orderByDesc
لفرز النتائج بترتيب تنازلي.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
يمكنك استدعاء الأسلوب orderByRelevance
لفرز النتائج حسب عدد تكرارات مصطلحات البحث. تخيل هاتين الجملتين:
إذا كنت تبحث عن Apple iPad ، فستظهر الجملة الثانية أولاً، نظرًا لوجود المزيد من التطابقات لمصطلحات البحث.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
لا يتم دعم الترتيب حسب الصلة إذا كنت تبحث من خلال العلاقات (المتداخلة).
لفرز النتائج حسب نوع النموذج، يمكنك استخدام التابع orderByModel
من خلال إعطائها الترتيب المفضل للنماذج:
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
نحن نوصي بشدة بترقيم نتائجك. قم باستدعاء طريقة paginate
قبل طريقة search
، وستحصل على مثيل IlluminateContractsPaginationLengthAwarePaginator
نتيجة لذلك. تأخذ طريقة paginate
ثلاث معلمات (اختيارية) لتخصيص مرقّم الصفحات. هذه الوسيطات هي نفسها المستخدمة في ترقيم الصفحات في قاعدة بيانات Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
يمكنك أيضًا استخدام ترقيم الصفحات البسيط. سيعيد هذا مثيلاً لـ IlluminateContractsPaginationPaginator
، الذي لا يعرف طوله:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
بدلًا من اسم الفئة، يمكنك أيضًا تمرير نسخة من منشئ الاستعلام Eloquent إلى التابع add
. يتيح لك ذلك إضافة قيود لكل نموذج.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
يمكنك البحث خلال أعمدة متعددة عن طريق تمرير مصفوفة من الأعمدة كوسيطة ثانية.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
يمكنك البحث من خلال العلاقات (المتداخلة) باستخدام رمز النقطة :
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
يمكنك استخدام بحث النص الكامل الخاص بـ MySQL باستخدام طريقة addFullText
. يمكنك البحث من خلال عمود واحد أو عدة أعمدة (باستخدام فهارس النص الكامل)، ويمكنك تحديد مجموعة من الخيارات، على سبيل المثال، لتحديد الوضع. يمكنك أيضًا الجمع بين عمليات البحث العادية وعمليات البحث عن النص الكامل في استعلام واحد:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
إذا كنت تريد البحث في العلاقات، فأنت بحاجة إلى تمرير مصفوفة حيث يحتوي مفتاح المصفوفة على العلاقة، في حين أن القيمة عبارة عن مصفوفة من الأعمدة:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
يحتوي MySQL على خوارزمية soundex مدمجة حتى تتمكن من البحث عن المصطلحات التي تبدو متشابهة تقريبًا. يمكنك استخدام هذه الميزة عن طريق استدعاء التابع soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
ليس هناك الكثير لشرحه هنا، ولكن هذا مدعوم أيضًا :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
يمكنك استدعاء طريقة search
بدون مصطلح أو بمصطلح فارغ. في هذه الحالة، يمكنك تجاهل الوسيطة الثانية لأسلوب add
. باستخدام التابع orderBy
، يمكنك ضبط العمود للفرز حسب (الوسيطة الثالثة سابقًا):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
يمكنك حساب عدد النتائج بطريقة count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
يمكنك استخدام includeModelType
لإضافة نوع النموذج إلى نتيجة البحث.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
بشكل افتراضي، يستخدم مفتاح type
، ولكن يمكنك تخصيص ذلك عن طريق تمرير المفتاح إلى الطريقة.
يمكنك أيضًا تخصيص قيمة type
عن طريق إضافة طريقة عامة searchType()
إلى النموذج الخاص بك لتجاوز الاسم الأساسي للفئة الافتراضية.
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
يمكنك استخدام المحلل اللغوي مع طريقة parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
يمكنك أيضًا تمرير رد اتصال كوسيطة ثانية للتكرار خلال كل مصطلح:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
الرجاء مراجعة سجل التغيير للحصول على مزيد من المعلومات حول ما تغير مؤخرًا.
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
Inertia Table
: الجدول النهائي لـ Inertia.js مع منشئ الاستعلام المدمج.Laravel Blade On Demand
: حزمة Laravel لتجميع قوالب Blade في الذاكرة.Laravel Eloquent Scope as Select
: توقف عن تكرار نطاقات وقيود استعلام Eloquent في PHP. تتيح لك هذه الحزمة إعادة استخدام نطاقات وقيود الاستعلام الخاصة بك عن طريق إضافتها كاستعلام فرعي.Laravel FFMpeg
: توفر هذه الحزمة التكامل مع FFmpeg لـ Laravel. تتم معالجة تخزين الملفات بواسطة نظام ملفات Laravel.Laravel MinIO Testing Tools
: قم بإجراء اختباراتك على خادم MinIO S3.Laravel Mixins
: مجموعة من الأشياء الجيدة Laravel.Laravel Paddle
: تكامل Paddle.com API لـ Laravel مع دعم خطافات الويب/الأحداث.Laravel Task Runner
: اكتب نصوص Shell مثل Blade Components وقم بتشغيلها محليًا أو على خادم بعيد.Laravel Verify New Email
: تضيف هذه الحزمة دعمًا للتحقق من عناوين البريد الإلكتروني الجديدة: عندما يقوم المستخدم بتحديث عنوان بريده الإلكتروني، فلن يحل محل العنوان القديم حتى يتم التحقق من العنوان الجديد.Laravel XSS Protection
: برنامج Laravel الوسيط لحماية تطبيقك من البرمجة النصية عبر المواقع (XSS). إنه يعقم مدخلات الطلب، ويمكنه أن يصحح بيانات صدى Blade.إذا اكتشفت أي مشكلات متعلقة بالأمان، فيرجى إرسال بريد إلكتروني إلى [email protected] بدلاً من استخدام أداة تعقب المشكلات.
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.
هذه الحزمة هي Treeware. إذا كنت تستخدمها في الإنتاج، فإننا نطلب منك أن تشتري للعالم شجرة لشكرنا على عملنا. من خلال المساهمة في غابة Treeware، ستخلق فرص عمل للعائلات المحلية وتستعيد موائل الحياة البرية.