一個有用的庫,用於為 Eloquent 製作過濾器。
該程式庫對於使用 Eloquent 在 Rest API 中建立搜尋過濾器非常有用。
??
Eloquent Filter 函式庫可用於為 Laravel 專案中模型的搜尋條件建立模式。這個想法是聚合過濾器只是傳遞請求負載中的值。
安裝時,您應該使用 Composer。運行以下命令:
composer require laravellegends/eloquent-filter
LaravelLegendsEloquentFilterConcernsHasFilter
特徵可以在將套用搜尋過濾器的模型中使用。
use LaravelLegends EloquentFilter Concerns HasFilter ;
class User extends Model
{
use HasFilter ;
}
HasFilter
特徵提供了filter
和withFilter
方法。
在 Laravel 應用程式中使用此函式庫的簡單方法是在取得模型結果之前呼叫filter
方法。
例子:
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 ();
}
}
您可以在呼叫/api/users?exact[id]=1
時顯示結果。將套用 SQL 查詢"select * from users where (id = 1)"
。
注意:顯示規則會話以獲取更多資訊。
另一種方法是對模型使用特定的過濾器。您可以繼承 ModelFilter 類別來為模型建立自訂過濾器。
要建立此類,您應該使用命令php artisan make:filter
,如下例所示:
$ php artisan make:filter UserFilter
上面的命令將產生以下類別:
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 ' ],
];
}
}
在控制器中
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 ();
}
}
上述程式碼在內部將被調用,範例如下:
User :: where ( function ( $ query ) {
$ query -> where ( ' name ' , ' LIKE ' , ' Wallace% ' );
$ query -> where ( ' role_id ' , ' <> ' , ' 2 ' );
})
-> orderBy ( ' name ' )
-> get ();
該程式庫在內部套用基於具有特殊 keyworks 名稱的查詢字串參數的過濾器。
查看所有參數如下:
列的最大值。 url api/users?max[field]=100
就像User::where('field', '<=', 100)
。
列的最小值。 url api/users?min[age]=33
就像User::where('age', '>=', 33)
。
列中包含的搜尋詞。 url api/users?contains[name]=wallace
就像User::where('name', 'LIKE', '%wallace%')
。
根據字串的結尾內容搜尋一個值。類似於具有%$value
值的LIKE
。
當值以特定值開頭時過濾欄位。 url api/users?starts_with[name]=brcontainer
聽起來像User::where('name', 'LIKE', 'brcontainer%')
。
按字段的精確值搜尋· url api/users?exact[email][email protected]
聽起來像User::where('name', '=', '[email protected]')
。
按關係過濾。您可以使用0
或1
值。
例子:
url api/users?has[posts]=1
就像User::has('posts')
url api/users?has[posts]=0
就像User::doesntHave('posts')
將WHERE IS NULL
或WHERE IS NOT NULL
套用至查詢。
例子:
url api/users?is_null[cpf]=1
就像User::whereNull('cpf')
url api/users?is_null[age]=0
就像User::whereNotNull('age')
當列沒有傳遞的值時進行搜尋。
例子:
A url api/users?not_in[role][]=1¬_in[role][]=2
相當於User::whereNotIn('role', [1, 2])
注意:當not_in[my_field]
為空數組時,不會執行任何操作。
搜尋列何時具有傳遞的值。
例子:
url api/users?in[role][]=10&in[role][]=20
聽起來像User::whereIn('role', [10, 20])
注意:當in[my_field]
為空數組時,不會執行任何操作。
按日期欄位的最大值搜尋。
url api/users?date_max[created_at]=2021-01-01
聽起來像User::whereDate('created_at', '<=', '2021-01-01')
按日期欄位的最小值搜尋。
例子:
url api/users?date_min[created_at]=2021-01-01
聽起來像User::whereDate('created_at', '>=', '2021-01-01')
按傳遞的不相等值進行搜尋。如果您在相關欄位中使用,則將套用 whereDoesntHave。
例子:
url api/users?not_equal[profile_id]=3
聽起來像
User :: where ( ' profile_id ' , ' <> ' , ' 3 ' );
url api/users?not_equal[roles.id]=1
聽起來像
User :: whereDoesntHave ( ' roles ' , fn ( $ query ) => $ query -> where ( ' id ' , ' = ' , 3 ));
url api/users?year_max[created_at]=2000
聽起來像
User :: whereYear ( ' created_at ' , ' <= ' , 2000 );
url api/users?year_min[created_at]=1998
聽起來像
User :: whereYear ( ' created_at ' , ' >= ' , 1998 );
url api/users?year_exact[created_at]=1998
聽起來像
User :: whereYear ( ' created_at ' , ' = ' , 1998 );
您可以在模型中定義的關係方法中套用搜尋篩選器。
例如:
模型:
class User extends Model
{
use HasFilter ;
public function phones ()
{
return $ this -> hasMany ( Phone ::class, ' user_id ' );
}
}
過濾器:
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 ();
}
}
在下列範例中,將過濾使用者以尋找包含值55
的相關電話。
api/users?exact[phones.number]=55
類似:
User :: where ( function ( $ query ) {
$ query -> whereHas ( ' phones ' , function ( $ query ) {
$ query -> where ( ' number ' , ' = ' , ' 55 ' );
});
})-> paginate ();
如果您使用axios
庫,則可以使用params
選項包含上述過濾器。
例子:
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
}
} )