Paket Laravel ini memungkinkan Anda mencari melalui beberapa model Eloquent. Ini mendukung pengurutan, penomoran halaman, kueri tercakup, hubungan pemuatan yang menarik, dan pencarian melalui satu atau beberapa kolom.
❤️ Kami dengan bangga mendukung komunitas dengan mengembangkan paket Laravel dan membagikannya secara gratis. Jika paket ini menghemat waktu Anda atau jika Anda mengandalkannya secara profesional, mohon pertimbangkan untuk mensponsori pemeliharaan dan pengembangan dan lihat paket premium terbaru kami: Tabel Inersia. Melacak masalah dan permintaan penarikan memerlukan waktu, namun kami dengan senang hati membantu!
Jika Anda ingin tahu lebih banyak tentang latar belakang paket ini, silakan baca postingan blog.
Anda dapat menginstal paket melalui composer:
composer require protonemedia/laravel-cross-eloquent-search
get
telah diubah namanya menjadi search
.addWhen
telah dihapus dan digantikan dengan when
.updated_at
. Jika Anda tidak menggunakan stempel waktu, kunci utama sekarang akan digunakan secara default. startWithWildcard
telah diubah namanya menjadi beginWithWildcard
.getUpdatedAtColumn
. Sebelumnya ini dikodekan secara keras updated_at
. Anda masih dapat menggunakan kolom lain untuk memesan berdasarkan.allowEmptySearchQuery
dan EmptySearchQueryException
telah dihapus, namun Anda masih bisa mendapatkan hasil tanpa melakukan pencarian. Mulai kueri penelusuran Anda dengan menambahkan satu atau beberapa model untuk ditelusuri. Panggil metode add
dengan nama kelas model dan kolom yang ingin Anda cari. Kemudian panggil metode search
dengan istilah pencarian, dan Anda akan mendapatkan instance IlluminateDatabaseEloquentCollection
dengan hasilnya.
Hasilnya diurutkan dalam urutan menaik berdasarkan kolom yang diperbarui secara default. Dalam kebanyakan kasus, kolom ini updated_at
. Jika Anda telah menyesuaikan konstanta UPDATED_AT
model Anda, atau menimpa metode getUpdatedAtColumn
, paket ini akan menggunakan kolom yang disesuaikan. Jika Anda tidak menggunakan stempel waktu sama sekali, kunci utama akan digunakan secara default. Tentu saja Anda juga bisa memesan melalui kolom lain.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Jika Anda peduli dengan lekukan, Anda dapat menggunakan metode new
pada fasad secara opsional:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Ada juga metode when
untuk menerapkan klausa tertentu berdasarkan kondisi lain:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
Secara default, kami membagi istilah pencarian, dan setiap kata kunci akan mendapatkan simbol wildcard untuk melakukan pencocokan sebagian. Secara praktis ini berarti istilah pencarian apple ios
akan menghasilkan apple%
dan ios%
. Jika Anda juga menginginkan simbol wildcard, Anda dapat memanggil metode beginWithWildcard
. Ini akan menghasilkan %apple%
dan %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
Catatan: di versi sebelumnya dari paket ini, metode ini disebut startWithWildcard()
.
Jika Anda ingin menonaktifkan perilaku di mana wildcard ditambahkan ke persyaratan, Anda harus memanggil metode endWithWildcard
dengan false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
Pencarian multi-kata didukung secara langsung. Cukup bungkus frasa Anda menjadi tanda kutip ganda.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
Anda dapat menonaktifkan penguraian istilah pencarian dengan memanggil metode dontParseTerm
, yang memberikan hasil yang sama seperti menggunakan tanda kutip ganda.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
Jika Anda ingin mengurutkan hasil berdasarkan kolom lain, Anda bisa meneruskan kolom tersebut ke metode add
sebagai parameter ketiga. Panggil metode orderByDesc
untuk mengurutkan hasil dalam urutan menurun.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
Anda dapat memanggil metode orderByRelevance
untuk mengurutkan hasil berdasarkan jumlah kemunculan istilah pencarian. Bayangkan dua kalimat ini:
Jika Anda mencari Apple iPad , kalimat kedua akan muncul lebih dulu, karena istilah pencariannya lebih cocok.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
Pengurutan berdasarkan relevansi tidak didukung jika Anda menelusuri hubungan (bersarang).
Untuk mengurutkan hasil berdasarkan jenis model, Anda dapat menggunakan metode orderByModel
dengan memberikan urutan model pilihan Anda:
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 ' );
Kami sangat menyarankan untuk memberi nomor halaman pada hasil Anda. Panggil metode paginate
sebelum metode search
, dan Anda akan mendapatkan instance IlluminateContractsPaginationLengthAwarePaginator
sebagai hasilnya. Metode paginate
memerlukan tiga parameter (opsional) untuk menyesuaikan paginator. Argumen ini sama dengan paginator database Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Anda juga dapat menggunakan penomoran halaman sederhana. Ini akan mengembalikan instance IlluminateContractsPaginationPaginator
, yang tidak diketahui panjangnya:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Selain nama kelas, Anda juga dapat meneruskan instance pembuat kueri Eloquent ke metode add
. Ini memungkinkan Anda menambahkan batasan pada setiap model.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
Anda dapat mencari melalui beberapa kolom dengan meneruskan array kolom sebagai argumen kedua.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
Anda dapat mencari melalui hubungan (bersarang) dengan menggunakan notasi titik :
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
Anda dapat menggunakan Pencarian Teks Lengkap MySQL dengan menggunakan metode addFullText
. Anda dapat mencari melalui satu atau beberapa kolom (menggunakan indeks teks lengkap), dan Anda dapat menentukan serangkaian opsi, misalnya, untuk menentukan mode. Anda bahkan dapat menggabungkan penelusuran reguler dan teks lengkap dalam satu kueri:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
Jika Anda ingin menelusuri relasi, Anda harus memasukkan array yang kunci arraynya berisi relasi tersebut, sedangkan nilainya adalah array kolom:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL memiliki algoritma soundex bawaan sehingga Anda dapat mencari istilah yang bunyinya hampir sama. Anda dapat menggunakan fitur ini dengan memanggil metode soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
Tidak banyak yang bisa dijelaskan di sini, tapi ini didukung juga :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
Anda memanggil metode search
tanpa istilah atau dengan istilah kosong. Dalam hal ini, Anda dapat membuang argumen kedua dari metode add
. Dengan metode orderBy
, Anda dapat mengatur kolom untuk diurutkan berdasarkan (sebelumnya argumen ketiga):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
Anda dapat menghitung jumlah hasil dengan metode count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
Anda dapat menggunakan includeModelType
untuk menambahkan tipe model ke hasil pencarian.
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 ",
},
],
...
}
Secara default, ini menggunakan kunci type
, tetapi Anda dapat menyesuaikannya dengan meneruskan kunci ke metode tersebut.
Anda juga dapat menyesuaikan nilai type
dengan menambahkan metode publik searchType()
ke model Anda untuk mengganti nama dasar kelas default.
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 " ,
}
],
...
Anda dapat menggunakan parser dengan metode parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
Anda juga dapat meneruskan panggilan balik sebagai argumen kedua untuk mengulang setiap istilah:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Inertia Table
: Tabel Utama untuk Inertia.js dengan Pembuat Kueri bawaan.Laravel Blade On Demand
: Paket Laravel untuk mengkompilasi template Blade di memori.Laravel Eloquent Scope as Select
: Berhenti menduplikasi cakupan dan batasan kueri Eloquent Anda di PHP. Paket ini memungkinkan Anda menggunakan kembali cakupan dan batasan kueri dengan menambahkannya sebagai subkueri.Laravel FFMpeg
: Paket ini menyediakan integrasi dengan FFmpeg untuk Laravel. Penyimpanan file ditangani oleh Sistem File Laravel.Laravel MinIO Testing Tools
: Jalankan pengujian Anda terhadap server MinIO S3.Laravel Mixins
: Kumpulan barang Laravel.Laravel Paddle
: Integrasi API Paddle.com untuk Laravel dengan dukungan untuk webhook/acara.Laravel Task Runner
: Tulis skrip Shell seperti Blade Components dan jalankan secara lokal atau di server jarak jauh.Laravel Verify New Email
: Paket ini menambahkan dukungan untuk memverifikasi alamat email baru: ketika pengguna memperbarui alamat emailnya, ia tidak akan mengganti alamat email lama sampai alamat email baru diverifikasi.Laravel XSS Protection
: Laravel Middleware untuk melindungi aplikasi Anda dari skrip lintas situs (XSS). Ini membersihkan masukan permintaan, dan dapat mensanitasi pernyataan gema Blade.Jika Anda menemukan masalah apa pun terkait keamanan, silakan kirim email ke [email protected] daripada menggunakan pelacak masalah.
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.
Paket ini adalah Treeware. Jika Anda menggunakannya dalam produksi, kami meminta Anda membelikan dunia sebatang pohon sebagai ucapan terima kasih atas pekerjaan kami. Dengan berkontribusi pada hutan Treeware, Anda akan menciptakan lapangan kerja bagi keluarga lokal dan memulihkan habitat satwa liar.