ห้องสมุดที่มีประโยชน์ในการสร้างตัวกรองสำหรับ Eloquent
ไลบรารีนี้มีประโยชน์ในการสร้างตัวกรองการค้นหาใน Rest API ของคุณโดยใช้ Eloquent
-
ไลบรารีตัวกรอง Eloquent สามารถใช้เพื่อสร้างรูปแบบสำหรับเกณฑ์การค้นหาในโมเดลในโครงการ 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 ();
ไลบรารีนี้ใช้ตัวกรองภายในตามพารามิเตอร์สตริงการสืบค้นพร้อมชื่อคีย์เวิร์คพิเศษ
ดูพารามิเตอร์ทั้งหมดดังนี้:
ค่าสูงสุดของคอลัมน์ 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%')
ค้นหาค่าตามเนื้อหาสิ้นสุดของสตริง คล้ายกับ LIKE
ที่มีค่า %$value
กรองฟิลด์เมื่อค่าเริ่มต้นด้วยค่าที่กำหนด 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
}
} )