如何使Laravel雄辩的资源在链接中包含过滤器参数?

时间:2019-02-07 17:47:05

标签: json laravel api eloquent resources

我们正在尝试使用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
}

因此,它的分页正确,但是链接中未包含过滤器,我认为这是不正确的(客户端应该能够信任那些链接以获取下一页其当前选择的数据集...)

反正我们可以做到吗?

1 个答案:

答案 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'))
        );
    }
}