Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何使Laravel雄辩的资源在链接中包含过滤参数?_Json_Laravel_Api_Eloquent_Resources - Fatal编程技术网

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

Json 如何使Laravel雄辩的资源在链接中包含过滤参数?,json,laravel,api,eloquent,resources,Json,Laravel,Api,Eloquent,Resources,我们正在通过Spatial对查询生成器进行一些实验,我想返回一个资源集合 不幸的是,当您向请求添加过滤器时,这些过滤器不会作为回复的第一、最后、上一和下一个链接的一部分发送回来 这是我们的代码(只是一个非常简单的模式ExchangeRate的示例): class ExchangeRateController extends Controller { public function index(Request $request) { return \App\Resources

我们正在通过Spatial对查询生成器进行一些实验,我想返回一个资源集合

不幸的是,当您向请求添加过滤器时,这些过滤器不会作为回复的第一、最后、上一和下一个链接的一部分发送回来

这是我们的代码(只是一个非常简单的模式
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
时,我们会得到一页,只有一条记录。这一切都很好,但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
}
因此,它正确地完成了分页,但是链接中没有包含过滤器,我认为这是不正确的(客户端应该能够信任这些链接来获取其当前选定数据集的下一页…)


无论如何,我们可以这样做吗?

我认为这不是软件包的责任。Laravel分页不会在链接中保留查询字符串。这似乎是自4.2以来的行为。请参阅

不过,您可以通过以下方法来实现:

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

我认为这不是软件包的责任。Laravel分页不会在链接中保留查询字符串。这似乎是自4.2以来的行为。请参阅

不过,您可以通过以下方法来实现:

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

哈?这对我来说真的毫无意义-为什么你说这不是软件包的责任?我正在查询一个带有一些参数的资源,它会返回不同页面的链接;如果客户端请求这些链接,它只会返回完全不同的信息…你在调用
paginate()扩展Laravel的生成器./CODE。我也没有看到包做任何事情来添加默认过滤器。也许它应该是有争议的。我认为它应该是真的。Laravel的生成器是生成分页链接的;它应该考虑所有的资源参数,不是吗?为什么雄辩者正确地应用过滤器,但不考虑。这对我来说毫无意义:(因为使用
appends()
添加所需的参数很容易,我认为这样做是为了保持灵活性。您可以始终向库提交PR以添加默认筛选器。这也有意义:)了解Laravel,它可能不会成功,但我只是想让它变得易于管理……我不想在每个控制器方法中重复这种逻辑;-)不过谢谢你的回复!呵呵?这对我来说真的毫无意义-你为什么说这不是包裹的责任?我用一些参数查询一个资源,它返回不同页面的链接;如果客户端请求这些链接,它只会返回完全不同的信息……您正在调用
paginate()
,它扩展了Laravel的生成器。请参阅-我也没有看到包在添加默认过滤器方面做任何事情。也许应该。这是有争议的,我认为应该这样做。Laravel的生成器生成分页链接;它应该考虑所有的资源参数,不是吗?为什么EooQueNT正确地应用过滤器,但不考虑它们来生成链接。这对我来说毫无意义:(因为使用
appends()
添加所需的参数很容易,我认为这样做是为了保持灵活性。你可以随时向库提交PR来添加默认过滤器。这也有意义:)了解Laravel,可能不会成功,但我只是想让它易于管理。。。我不想在每个控制器方法中重复该逻辑;-)谢谢你的回复!