使用 Laravel Eloquent 实现过滤器和分页
P粉010967136
P粉010967136 2023-11-12 18:42:35

我正在尝试创建一个 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粉010967136
P粉010967136

全部回复(1)
P粉268284930

您的主要问题是这一行:

$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));
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!