我将API平台与Symfony 4一起使用,并尝试按以下说明使用日期过滤器:https://api-platform.com/docs/core/filters/
当我像这样使用过滤器.... something?_page = 1&lieferdat [after] = 2018-12-01&lieferdat [before] = 2018-12-30
hydra响应表明括号是url编码的,我认为它无法正常工作,因为我得到了所有结果而不是经过过滤的结果。 在我的实体中,我添加了DateFilter以及其他似乎正确的其他过滤器。
九头蛇回应: “某物?lieferdat%5Bafter%5D = 2018-12-01&lieferdat%5Bbefore%5D = 2018-12-30&_page = 1”
任何人都可以解释我是否可以在请求中使用方括号或更好的方括号: 谁能为Api Platform提供有效的日期过滤器实现,以演示如何在两个日期之间进行过滤?
感谢您的建议, 最好的问候
答案 0 :(得分:1)
好吧,我不知道这个解决方案是否有帮助,但这是我通常做的...首先,您的请求的 URL 应该像这样编码:
http://example.com/api/some-endpoint?availableDate.date%5Bstrictly_before%5D=2020-01-02&availableDate.date%5Bstrictly_after%5D=2020-02-04&page=1
你的实体应该像这样注释:
@ApiFilter(
DateFilter::class,
properties={
"availableDate"
}
)
还请注意,您可以像这样从嵌入对象中过滤属性:
@ApiFilter(
DateFilter::class,
properties={
"exampleProperty.embeddedProperty"
}
)
其中“exampleProperty”是您要过滤的实体内的字段,“embeddedProperty”是另一个实体(嵌入的)中的字段名称
这是我如何在 JavaScript 中创建 URL 以发出 AJAX 请求的示例:
export const setAvailableDateURLFilters = ( pag = null, before = null, strictlyBefore = null,after = null, strictlyAfter = null) =>{
let url = "/api/available-dates?";
if(before)
url === "/api/available-dates?" ? (url += "date%5Bbefore%5D=" + before) : (url += "&date%5Bbefore%5D=" + before);
if(strictlyBefore)
url === "/api/available-dates?" ? (url += "date%5Bstrictly_before%5D=" + strictlyBefore) : (url += "&date%5Bstrictly_before%5D=" + strictlyBefore);
if(after)
url === "/api/available-dates?" ? (url += "date%5Bafter%5D=" + after) : (url += "&date%5Bafter%5D=" + after);
if(strictlyAfter)
url === "/api/available-dates?" ? (url += "date%5Bstrictly_after%5D=" + strictlyAfter) : (url += "&date%5Bstrictly_after%5D=" + strictlyAfter);
if(pag)
url === "/api/available-dates?" ? ( url += 'page=' + pag) : (url += '&page=' + pag);
return url;
}
你的回答是对的!我只是添加一些提示和信息!希望这对某人有所帮助...干杯!
答案 1 :(得分:0)
好的,我回答了我自己的问题。 我的问题的答案:symfony api平台可以识别那些url编码的括号吗?答案是:是
在对Postman进行了反复试验后,我开始使用它。
当我订购查询反向时:
代替
something?lieferdat[after]=2019-03-01&lieferdat[before]=2019-03-31
我撤消了这个
something?lieferdat[before]=2019-03-31&lieferdat[after]=2019-03-01
有效!
唯一的是,有时如果我指定一个月,有时我会从前一个月获得1-2个值,这不是我想要的值,并且使我感到困惑。 我尝试使用
?lieferdat[strictly_before]=2019-03-31&lieferdat[strictly_after]=2019-03-01
但这并没有带来效果。
Edit2:答案很简单,在我的实体中,我定义了搜索过滤器,但未定义该过滤器可在其上使用的属性,因此它可在该实体中的所有日期属性上使用
任何帮助仍然感激不尽:)