Heim  >  Fragen und Antworten  >  Hauptteil

Implementieren Sie Filter und Paginierung mit Laravel Eloquent

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粉010967136P粉010967136365 Tage vor843

Antworte allen(1)Ich werde antworten

  • P粉268284930

    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));

    Antwort
    0
  • StornierenAntwort