Heim > Fragen und Antworten > Hauptteil
Ich versuche, eine API zu erstellen, die alle Kundendatensätze aus einer Datenbank zurückgibt. Dies bietet jedoch Paging- und Filterfunktionen. ,
Die Filterfunktion ist ein optionaler Abfrageparameter. Es muss also nicht in den Abfrageparametern enthalten sein.
Aber ich habe ein Problem damit.
Dies ist die Indizierungsmethode in der CustomerController
-Datei:
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)); }
Oder gibt es eine bessere Möglichkeit, optionale Filterfunktionen mit Paginierung zu kombinieren?
Vielen Dank.
P粉2682849302023-11-13 10:57:10
您的主要问题是这一行:
$customers = Customer::all();
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));