首页  >  问答  >  正文

使用 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粉010967136365 天前840

全部回复(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
  • 取消回复