首頁  >  問答  >  主體

使用 Laravel Eloquent 實作篩選器和分頁

我正在嘗試建立一個 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));
    }

或有更好的方法將可選過濾功能與分頁結合嗎?

謝謝。

P粉010967136P粉010967136315 天前769

全部回覆(1)我來回復

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

    回覆
    0
  • 取消回覆