Paket ini menambahkan fungsionalitas pencarian/pemfilteran ke model Eloquent di Laravel 4/5/6.
Anda juga dapat menemukan paket-paket tersebut berguna:
Tambahkan baris berikut ke file composer.json
di proyek Anda:
"jedrzej/searchable": "0.0.17"
atau jalankan perintah berikut pada baris perintah di folder akar proyek Anda:
composer require "jedrzej/searchable" "0.0.17"
Untuk membuat model Eloquent dapat dicari, tambahkan sifat ke model dan tentukan daftar bidang yang dapat digunakan untuk memfilter model. Anda dapat menentukan properti $searchable atau menerapkan metode getSearchableAttributes jika Anda ingin menjalankan beberapa logika untuk menentukan daftar bidang yang dapat dicari.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of searchable fields...
public $ searchable = [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
// ...or a method that returns a list of searchable fields
public function getSearchableAttributes ()
{
return [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
}
}
Agar semua kolom dapat dicari, beri tanda bintang * pada daftar kolom yang dapat dicari:
public $ searchable = [ ' * ' ];
Dimungkinkan juga untuk memasukkan atribut model ke dalam daftar hitam untuk mencegahnya difilter.
Anda dapat menentukan properti $notSearchable atau menerapkan metode getNotSearchableAttributes jika Anda ingin menjalankan beberapa logika untuk menentukan daftar bidang yang dapat dicari.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of not searchable fields...
public $ notSearchable = [ ' created_at ' ];
// ...or a method that returns a list of not searchable fields
public function getNotSearchableAttributes ()
{
return [ ' created_at ' ];
}
}
Jika Anda menentukan kedua daftar - kolom yang dapat dicari dan tidak dapat dicari - kumpulan bidang yang dapat dicari yang dihasilkan akan berisi semua atribut yang masuk daftar putih kecuali semua atribut yang masuk daftar hitam.
SearchableTrait
menambahkan cakupan filtered()
ke model - Anda dapat meneruskannya dengan kueri berupa serangkaian kondisi filter:
// return all posts with forum_id equal to $forum_id
Post :: filtered ([ ' forum_id ' => $ forum_id ])-> get ();
// return all posts with with <operator> applied to forum_id
Post :: filtered ([ ' forum_id ' => <operator>])-> get ();
atau akan menggunakan Request::all()
sebagai default:
// if you append ?forum_id=<operator> to the URL, you'll get all Posts with <operator> applied to forum_id
Post :: filtered ()-> get ();
Mode kueri default adalah menerapkan konjungsi ( AND
) dari semua kueri ke model yang dapat dicari. Hal ini dapat diubah menjadi disjungsi ( OR
) dengan menetapkan nilai parameter kueri mode
ke or
. Jika parameter kueri mode
sudah digunakan, nama yang dikembalikan oleh metode getQueryMode
akan digunakan.
SearchableTrait
mendukung operator berikut:
Operator perbandingan mengizinkan pemfilteran berdasarkan hasil perbandingan atribut model dan nilai kueri. Mereka bekerja untuk string, angka, dan tanggal. Mereka memiliki format berikut:
(<operator>)<value>
Operator perbandingan berikut tersedia:
gt
untuk greater than
perbandingange
untuk perbandingan greater than or equal
lt
less than
perbandingan, misalnyale
untuk perbandingan les than or equal
Untuk memfilter postingan dari tahun 2015 dan yang lebih baru, kueri berikut harus digunakan:
?created_at=(ge)2015-01-01
Sifat yang dapat dicari memungkinkan pemfilteran berdasarkan nilai pasti suatu atribut atau sekumpulan nilai, bergantung pada jenis nilai yang diteruskan sebagai parameter kueri. Jika nilai mengandung koma, parameter dibagi menjadi koma dan digunakan sebagai input array untuk pemfilteran IN
, jika tidak, pencocokan tepat akan diterapkan.
Untuk memfilter postingan dari pengguna dengan id 42, kueri berikut harus digunakan:
?user_id=42
Untuk memfilter postingan dari forum dengan id 7 atau 8, kueri berikut harus digunakan:
?forum_id=7,8
Operator Like mengizinkan pemfilteran menggunakan kueri LIKE
. Operator ini dipicu jika operator pencocokan tepat digunakan, tetapi nilainya mengandung tanda %
sebagai karakter pertama atau terakhir.
Untuk memfilter postingan yang dimulai dengan How
, kueri berikut harus digunakan:
?title=How%
Notice:
karakter persentase digunakan untuk mengkodekan karakter khusus dalam URL, jadi ketika mengirim permintaan pastikan alat yang Anda gunakan dengan benar encode the % character as %25
Operator null (null)
mengizinkan pemfilteran model yang atributnya null.
Untuk memfilter postingan yang tidak memiliki lampiran, kueri berikut harus digunakan:
?attachment_id=(null)
Dimungkinkan untuk mendapatkan hasil yang dinegasikan dari suatu kueri dengan menambahkan operator dengan !
.
Beberapa contoh:
//filter posts from all forums except those with id 7 or 8
?forum_id=!7,8
//filter posts older than 2015
?created_at=!(ge)2015
//filter posts with attachment
?attachment_id=!(null)
Dimungkinkan untuk menerapkan beberapa batasan untuk satu atribut model. Untuk mencapai hal tersebut, sediakan serangkaian filter kueri alih-alih satu filter:
// filter all posts from year 20** except 2013
?created_at[]=20%&created_at[]=!2013%
Dimungkinkan untuk memfilter berdasarkan atribut relasi model - whereHas()
Eloquent akan diterapkan. Untuk memfilter berdasarkan relasi, tambahkan atribut relasi ke daftar bidang searchable
dalam formulir relation:attribute
. String yang sama harus digunakan dalam kueri untuk memfilter berdasarkan atribut relasi tersebut, misalnya:
// allow filtering on user's active field
protected $searchable = ['user:active'];
// filter only posts of active users
?user:active=1
Dimungkinkan juga untuk meniadakan pencarian dan memfilter objek yang tidak memiliki hubungan yang cocok dengan menerapkan whereDoesntHave()
dari Eloquent. Untuk melakukan itu, awali nama relasi dengan !
:
// allow filtering on comment's approved field
protected $searchable = ['comments:approved'];
// filter only posts that have approved comments
?comments:approved=1
// filter only posts that have not-approved comments
?comments:approved=1
// filter only posts that do not have approved comments
?!comments:approved=1
Jika Anda ingin memfilter berdasarkan relasi yang disarangkan, cukup berikan nama relasi yang disarangkan dengan titik diganti dengan titik dua. Ini diperlukan karena PHP secara otomatis mengganti titik dengan garis bawah di URL.
// filter only posts that have comments from active authors
?comments:author:active=1
Dimungkinkan untuk memproses filter yang dipilih dengan logika Anda sendiri, misalnya ketika nama filter tidak cocok dengan nama atribut yang digunakan untuk pemfilteran atau beberapa operasi khusus perlu dijalankan. Untuk mengganti logika filter xyz
, Anda harus mendefinisikan metode dalam model Anda yang disebut processXyzFilter
. Metode ini harus mengembalikan true
, jika filter telah diproses dan logika default tidak lagi terjadi.
// use one filter to search in multiple columns
protected function processNameFilter ( Builder $ builder , Constraint $ constraint )
{
// this logic should happen for LIKE/EQUAL operators only
if ( $ constraint -> getOperator () === Constraint :: OPERATOR_LIKE || $ constraint -> getOperator () === Constraint :: OPERATOR_EQUAL ) {
$ builder -> where ( function ( $ query ) use ( $ constraint ) {
$ query -> where ( ' first_name ' , $ constraint -> getOperator (), $ constraint -> getValue ())
-> orWhere ( ' last_name ' , $ constraint -> getOperator (), $ constraint -> getValue ());
});
return true ;
}
// default logic should be executed otherwise
return false ;
}
Untuk mengganti filter pencarian relasi, ganti titik dua pada nama filter dengan garis bawah. Jika Anda ingin mengganti logika untuk user:active
, Anda perlu mendefinisikan metode processUser_ActiveFilter
.