我们正在尝试使用Spatie的查询构建器,我想返回一个Resource集合。
不幸的是,当您向请求添加过滤器时,这些过滤器不会作为答复的第一,最后,上一个和下一个链接的一部分发送回去。
这是我们的代码(仅是一个非常简单的模式ExchangeRate
的示例:
class ExchangeRateController extends Controller
{
public function index(Request $request) {
return \App\Resources\ExchangeRate::collection(
QueryBuilder::for(ExchangeRate::class)
->allowedFilters(
Filter::exact('currency'),
Filter::scope('valid-on')
)
->paginate());
}
}
当我们调用GET /api/exchangerates
时,我们将获得3页,每页15条记录。当我们调用GET /api/exchangerates?filter[currency]=USD
时,将得到只有1条记录的1页。一切都很好,但是json响应中的链接没有正确的链接。
没有过滤器,我们将获得以下链接:
"links": {
"first": "https://example.com/api/exchangerates?page=1",
"last": "https://example.com/api/exchangerates?page=3",
"prev": null,
"next": "https://example.com/api/exchangerates?page=2"
}
通过过滤器,我们在响应中获得了以下链接:
"links": {
"first": "https://example.com/api/exchangerates?page=1",
"last": "https://example.com/api/exchangerates?page=1",
"prev": null,
"next": null
}
因此,它的分页正确,但是链接中未包含过滤器,我认为这是不正确的(客户端应该能够信任那些链接以获取下一页其当前选择的数据集...)
反正我们可以做到吗?
答案 0 :(得分:0)
我认为这不是包裹的责任。 Laravel分页不会在链接中保留查询字符串。看来这是自4.2起的行为。参见this.
您可以使用以下方法来做到这一点:
class ExchangeRateController extends Controller
{
public function index(Request $request) {
return \App\Resources\ExchangeRate::collection(
QueryBuilder::for(ExchangeRate::class)
->allowedFilters(
Filter::exact('currency'),
Filter::scope('valid-on')
)
->paginate()
->appends($request->input('currency', 'valid-on'))
);
}
}