Paket ini memudahkan untuk mendapatkan pencarian terstruktur dari berbagai sumber. Berikut ini contoh saat kami menelusuri beberapa model. Kami telah melakukan sedikit persiapan pada model itu sendiri.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
Pencarian akan dilakukan peka huruf besar-kecil. $searchResults
sekarang berisi semua model User
yang berisi john
di atribut name
dan BlogPost
yang berisi 'john' di atribut title
.
Dalam tampilan Anda, Anda sekarang dapat mengulang hasil pencarian:
< 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
Dalam contoh ini kami menggunakan model, namun Anda dapat dengan mudah menambahkan aspek pencarian untuk API eksternal, daftar file, atau array nilai.
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Anda dapat menginstal paket melalui composer:
composer require spatie/laravel-searchable
Untuk menelusuri model, Anda harus membiarkan mereka mengimplementasikan antarmuka Searchable
.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
Anda hanya perlu menambahkan metode getSearchResult
ke setiap model pencarian yang harus mengembalikan instance SearchResult
. Berikut tampilannya untuk model postingan blog.
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
);
}
}
Dengan model yang disiapkan, Anda dapat mencarinya seperti ini:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
Pencarian akan dilakukan peka huruf besar-kecil. $searchResults
sekarang berisi semua model User
yang berisi john
dalam atribut name
.
Anda juga dapat meneruskan beberapa atribut untuk menelusuri:
// 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 ' );
Untuk mendapatkan kontrol yang lebih baik, Anda juga dapat menggunakan callable. Dengan cara ini Anda juga dapat mencari pencocokan tepat, menerapkan cakupan, hubungan pemuatan yang menarik, atau bahkan memfilter kueri seperti yang Anda lakukan menggunakan pembuat kueri.
$ 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 ' );
});
Anda tidak dibatasi hanya mendaftarkan model dasar sebagai aspek pencarian. Anda dapat dengan mudah membuat aspek pencarian kustom Anda sendiri dengan memperluas kelas SearchAspect
.
Pertimbangkan aspek penelusuran khusus berikut untuk menelusuri API eksternal:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
Inilah cara Anda menggunakannya:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
Dimungkinkan untuk membatasi jumlah hasil yang dikembalikan oleh setiap aspek dengan memanggil limitAspectResults
sebelum melakukan pencarian.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
Berikut ini contoh rendering hasil penelusuran:
< 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
Anda dapat menyesuaikan $type
dengan menambahkan properti publik $searchableType
pada model atau aspek pencarian kustom Anda
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Jika Anda menemukan bug terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.