تسهل هذه الحزمة الحصول على بحث منظم من مجموعة متنوعة من المصادر. فيما يلي مثال حيث نبحث في بعض النماذج. لقد قمنا بالفعل ببعض الاستعدادات الصغيرة للنماذج نفسها.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
سيتم إجراء البحث غير حساس لحالة الأحرف. يحتوي $searchResults
الآن على جميع نماذج User
التي تحتوي على john
في سمة name
و BlogPost
التي تحتوي على 'john' في سمة title
.
في طريقة العرض الخاصة بك، يمكنك الآن تكرار نتائج البحث:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
في هذا المثال، استخدمنا النماذج، ولكن يمكنك بسهولة إضافة جانب بحث لواجهة برمجة التطبيقات الخارجية أو قائمة الملفات أو مجموعة من القيم.
نحن نستثمر الكثير من الموارد في إنشاء أفضل الحزم مفتوحة المصدر في فئتها. يمكنك دعمنا عن طريق شراء أحد منتجاتنا المدفوعة.
نحن نقدر بشدة إرسالك لنا بطاقة بريدية من مسقط رأسك، مع ذكر الحزمة (الحزم) التي تستخدمها. ستجد عنواننا على صفحة الاتصال لدينا. ننشر جميع البطاقات البريدية المستلمة على جدار البطاقات البريدية الافتراضية لدينا.
يمكنك تثبيت الحزمة عبر الملحن:
composer require spatie/laravel-searchable
من أجل البحث في النماذج، سيتعين عليك السماح لهم بتنفيذ الواجهة Searchable
.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
ستحتاج فقط إلى إضافة أسلوب getSearchResult
إلى كل نموذج قابل للبحث والذي يجب أن يُرجع مثيل SearchResult
. إليك كيف يمكن أن يبدو نموذج منشور المدونة.
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
مع النماذج المعدة يمكنك البحث عنها كالتالي:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
سيتم إجراء البحث غير حساس لحالة الأحرف. يحتوي $searchResults
الآن على جميع نماذج User
التي تحتوي على john
في سمة name
.
يمكنك أيضًا تمرير سمات متعددة للبحث من خلالها:
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
للحصول على تحكم دقيق، يمكنك أيضًا استخدام أداة قابلة للاستدعاء. وبهذه الطريقة يمكنك أيضًا البحث عن التطابقات التامة، أو تطبيق النطاقات، أو علاقات التحميل المتحمسة، أو حتى تصفية استعلامك كما تفعل باستخدام منشئ الاستعلامات.
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
لا يقتصر الأمر على تسجيل النماذج الأساسية فقط كجوانب بحث. يمكنك بسهولة إنشاء جوانب البحث المخصصة الخاصة بك عن طريق توسيع فئة SearchAspect
.
خذ بعين الاعتبار جانب البحث المخصص التالي للبحث في واجهة برمجة التطبيقات الخارجية:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
هذه هي الطريقة التي يمكنك استخدامها:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
من الممكن تحديد كمية النتائج التي يتم إرجاعها من كل جانب عن طريق استدعاء limitAspectResults
قبل إجراء البحث.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
فيما يلي مثال على عرض نتائج البحث:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
يمكنك تخصيص $type
عن طريق إضافة خاصية عامة $searchableType
على النموذج الخاص بك أو جانب البحث المخصص
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
الرجاء مراجعة سجل التغيير للحصول على مزيد من المعلومات حول ما تغير مؤخرًا.
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
إذا وجدت خطأً يتعلق بالأمان، فيرجى إرسال بريد إلكتروني إلى العنوان [email protected] بدلاً من استخدام أداة تعقب المشكلات.
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.