【问题标题】:How to filter between two dates with the Date Filter in API Platform如何使用 API 平台中的日期过滤器在两个日期之间进行过滤
【发布时间】:2025-12-07 00:35:01
【问题描述】:

我将 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 平台提供一个有效的日期过滤器实现来演示如何在两个日期之间进行过滤吗?

感谢您的建议, 最好的问候

【问题讨论】:

    标签: api symfony4 api-platform.com


    【解决方案1】:

    好的,我在回答我自己的问题.. 我的问题的答案: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:好的答案很简单,在我的实体中我定义了搜索过滤器,但我没有定义该过滤器适用的属性,因此它适用于该实体中的所有日期属性

    任何帮助仍然感激:)

    【讨论】:

    • 日期过滤器的语法是?property[<after|before|strictly_after|strictly_before>]=value。该值可以采用\DateTime 构造函数支持的任何日期格式。 after 和 before 过滤器将过滤包括该值,而 strictly_afterstrictly_before 将过滤不包括该值。长话短说;您的解决方案可以正常工作,对吗?
    【解决方案2】:

    好吧,我不知道这个解决方案是否有帮助,但这是我通常会做的……首先,您的请求的 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;
    

    }

    你的答案是对的!我只是添加一些提示和信息!希望这对某人有所帮助...干杯!

    【讨论】: