我正在嘗試建立一個 API,該 API 將從資料庫傳回所有客戶記錄。但這提供了分頁和過濾功能。 ,
過濾功能是一個可選的查詢參數。因此不必將其包含在查詢參數中。
但我在這樣做時遇到了問題。
這是 CustomerController 檔案中的索引方法:
public function index(Request $request)
{
// Get how many item per page
$itemPerPage = $request->query('per_page');
// SQL Query
$customers = Customer::all();
// Filter data
if (!empty($request->name)) {
$customers = $customers->where('name', '=', $request->name);
}
// Return the result as JSON
return new CustomerCollection($customers->paginate($itemPerPage));
}
或有更好的方法將可選過濾功能與分頁結合嗎?
謝謝。
您的主要問題是這一行:
all()方法立即將所有customers記錄作為Collection傳回,該集合沒有->paginate( )方法: https://laravel.com/docs/9 .x/collections#available-methods。要選擇鏈接,請使用
->query()方法或->when()子句:使用
::query()取代::all():$itemPerPage = $request->query('per_page'); // SQL Query $customers = Customer::query(); // Filter data if (!empty($request->name)) { $customers = $customers->where('name', '=', $request->name); } // Return the result as JSON return new CustomerCollection($customers->paginate($itemPerPage));使用
->when()子句:$itemPerPage = $request->query('per_page'); $customers = Customer::when(!empty($request->name), function ($query) use ($request) { $query->where('name', '=', $request->name); }); return new CustomerCollection($customers->paginate($itemPerPage));