Pustaka yang berguna untuk membuat filter untuk Eloquent.
Pustaka ini berguna untuk membuat filter pencarian di Rest API Anda menggunakan Eloquent.
??
Library Eloquent Filter dapat digunakan untuk membuat pola kriteria pencarian pada model di Proyek Laravel Anda. Idenya adalah filter agregat yang hanya meneruskan nilai dalam payload permintaan Anda.
Untuk instalasi, Anda harus menggunakan Komposer. Jalankan perintah berikut:
composer require laravellegends/eloquent-filter
Sifat LaravelLegendsEloquentFilterConcernsHasFilter
dapat digunakan dalam model yang akan menerapkan filter pencarian.
use LaravelLegends EloquentFilter Concerns HasFilter ;
class User extends Model
{
use HasFilter ;
}
Sifat HasFilter
menyediakan metode filter
dan withFilter
.
Cara sederhana untuk menggunakan perpustakaan ini di aplikasi Laravel Anda adalah memanggil metode filter
sebelum mendapatkan hasil model Anda.
Contoh:
class UsersController extends Controller
{
use App Models User ;
public function index ()
{
return User :: filter ()-> paginate ();
}
// or
public function index ()
{
return User :: latest ( ' id ' )-> filter ()-> paginate ();
}
// or
public function index ( Request $ request )
{
return User :: filter ( $ request )-> paginate ();
}
}
Anda dapat menampilkan hasilnya saat memanggil /api/users?exact[id]=1
. Kueri sql "select * from users where (id = 1)"
akan diterapkan.
Catatan: Tampilkan sesi aturan untuk informasi lebih lanjut.
Cara lainnya adalah dengan menggunakan filter khusus untuk suatu model. Anda dapat mewarisi kelas ModelFilter untuk membuat filter khusus untuk suatu model.
Untuk membuat kelas ini, Anda harus menggunakan perintah php artisan make:filter
, seperti contoh berikut:
$ php artisan make:filter UserFilter
Perintah di atas akan menghasilkan kelas berikut:
namespace App Filters ;
use LaravelLegends EloquentFilter Filters ModelFilter ;
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' role_id ' => ' not_equal ' , // or ['not_equal']
' name ' => [ ' contains ' , ' starts_with ' ],
];
}
}
Di Pengendali
use App Models User ;
use Illuminate Http Request ;
use LaravelLegends EloquentFilter Filter ;
class UsersController extends Controller
{
// api/users?starts_with[name]=Wallace¬_equal[role_id]=2
public function index ( Request $ request )
{
return User :: withFilter ( new UserFilter , $ request )
-> orderBy ( ' name ' )
-> get ();
}
}
Kode di atas secara internal akan dipanggil sebagai contoh berikut:
User :: where ( function ( $ query ) {
$ query -> where ( ' name ' , ' LIKE ' , ' Wallace% ' );
$ query -> where ( ' role_id ' , ' <> ' , ' 2 ' );
})
-> orderBy ( ' name ' )
-> get ();
Pustaka ini menerapkan filter secara internal berdasarkan parameter string kueri dengan nama keywork khusus.
Lihat semua parameter berikut:
Nilai maksimum sebuah kolom. Url api/users?max[field]=100
seperti User::where('field', '<=', 100)
.
Nilai minimum kolom. Url api/users?min[age]=33
seperti User::where('age', '>=', 33)
.
Istilah pencarian yang terkandung dalam kolom. Url api/users?contains[name]=wallace
seperti User::where('name', 'LIKE', '%wallace%')
.
Cari nilai berdasarkan konten akhir string. Mirip dengan LIKE
dengan nilai %$value
.
Filter bidang ketika nilai dimulai dengan nilai tertentu. Url api/users?starts_with[name]=brcontainer
Kedengarannya seperti User::where('name', 'LIKE', 'brcontainer%')
.
Telusuri berdasarkan nilai bidang yang tepat· Url api/users?exact[email][email protected]
Kedengarannya seperti User::where('name', '=', '[email protected]')
.
Filter berdasarkan hubungan. Anda dapat menggunakan nilai 0
atau 1
.
Contoh:
Url api/users?has[posts]=1
seperti User::has('posts')
Url api/users?has[posts]=0
seperti User::doesntHave('posts')
Terapkan WHERE IS NULL
atau WHERE IS NOT NULL
ke kueri.
Contoh:
Url api/users?is_null[cpf]=1
seperti User::whereNull('cpf')
Url api/users?is_null[age]=0
seperti User::whereNotNull('age')
Mencari ketika kolom TIDAK MEMILIKI nilai yang diteruskan.
Contoh:
Url api/users?not_in[role][]=1¬_in[role][]=2
adalah setara dengan User::whereNotIn('role', [1, 2])
Catatan : Jika not_in[my_field]
adalah array kosong, tidak ada tindakan yang akan diambil.
Mencari ketika kolom MEMILIKI nilai yang diteruskan.
Contoh:
Url api/users?in[role][]=10&in[role][]=20
terdengar seperti User::whereIn('role', [10, 20])
CATATAN : Jika in[my_field]
adalah array kosong, tidak ada tindakan yang akan diambil.
Cari berdasarkan nilai maksimum bidang tanggal.
Url api/users?date_max[created_at]=2021-01-01
terdengar seperti User::whereDate('created_at', '<=', '2021-01-01')
Cari berdasarkan nilai minimum bidang tanggal.
Contoh:
Url api/users?date_min[created_at]=2021-01-01
terdengar seperti User::whereDate('created_at', '>=', '2021-01-01')
Pencarian berdasarkan nilai yang tidak sama berlalu. Jika Anda menggunakan bidang terkait, WhereDoesntHave akan diterapkan.
Contoh:
Url api/users?not_equal[profile_id]=3
terdengar seperti a
User :: where ( ' profile_id ' , ' <> ' , ' 3 ' );
Url api/users?not_equal[roles.id]=1
terdengar seperti a
User :: whereDoesntHave ( ' roles ' , fn ( $ query ) => $ query -> where ( ' id ' , ' = ' , 3 ));
Url api/users?year_max[created_at]=2000
terdengar seperti a
User :: whereYear ( ' created_at ' , ' <= ' , 2000 );
Url api/users?year_min[created_at]=1998
terdengar seperti a
User :: whereYear ( ' created_at ' , ' >= ' , 1998 );
Url api/users?year_exact[created_at]=1998
terdengar seperti a
User :: whereYear ( ' created_at ' , ' = ' , 1998 );
Anda dapat menerapkan filter pencarian dalam metode hubungan yang ditentukan dalam model Anda.
Misalnya:
Model:
class User extends Model
{
use HasFilter ;
public function phones ()
{
return $ this -> hasMany ( Phone ::class, ' user_id ' );
}
}
Filter:
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' id ' => [ ' exact ' , ' not_equal ' ],
' created_at ' => [ ' year_exact ' , ' date_max ' , ' date_min ' ],
' phones.number ' => [ ' contains ' ],
// or
' phones ' => new PhoneFilter ,
];
}
}
class PhoneFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' number ' => ' contains '
];
}
}
class UserController extends Controller
{
public function index ()
{
// api/users?not_in[role_id][]=1¬_in[role_id][]=3
// select * from users where (role_id NOT IN (1, 3))
return User :: withFilter ( new UserFilter )-> paginate ();
}
// Or, apply filter as nested query
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where (role_id = 1)
return User :: where ( UserFilter :: toClosure ())-> paginate ();
}
// Or apply in your query as base condition
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where role_id = 1
return User :: tap ( UserFilter :: toClosure ())-> paginate ();
}
}
Dalam contoh berikut, pengguna akan difilter untuk telepon terkait yang berisi nilai 55
.
api/users?exact[phones.number]=55
seperti:
User :: where ( function ( $ query ) {
$ query -> whereHas ( ' phones ' , function ( $ query ) {
$ query -> where ( ' number ' , ' = ' , ' 55 ' );
});
})-> paginate ();
Jika Anda menggunakan perpustakaan axios
, Anda dapat menggunakan opsi params
untuk menyertakan filter di atas.
Contoh:
const api = axios . create ( {
baseURL : 'http://localhost:8000/api'
} ) ;
api . get ( 'users' , {
params : {
'in[role]' : [ 1 , 2 , 3 ] ,
'contains[name]' : 'Maxters' ,
'is_null[name]' : 0
}
} )