是否可以在计算字段上创建过滤器?

Is it possible to create a filter on a calculated field?

我有一个具有以下架构的实体:

id, name, ..., startDate, endDate

我还在我的实体中添加了一个计算字段,它给我状态:

public function getStatus() {
    if (new \DateTime() < $this->getStartDate()) {
        return 'planned';
    }

    if (new \DateTime() > $this->getEndDate()) {
        return 'expired';
    }

    return 'published';
}

我想做的是能够在此字段上创建过滤器。我似乎无法在文档中找到它。我试过在它上面创建一个过滤器,就像在其他字段上创建过滤器一样,但是它没有出现在我的 swagger UI 界面中。

// config/services.yaml
services:
    ...

    view.search_filter:
        parent: 'api_platform.doctrine.orm.search_filter'
        arguments:
            $properties:
                id: 'exact'
                name: 'ipartial'
                ...
                status: 'exact' // doesn't seem to work
        tags:  [ 'api_platform.filter' ]
        ...

我还查看了有关编写自定义过滤器的文档,但据我所知,它必须是现有的 属性。

您定义的过滤器扩展了一个 ORM 过滤器 (api_platform.doctrine.orm.search_filter),这意味着过滤器最终将转换为数据库查询。

直到 检索行后,您的“计算字段”值才为人所知,因此无法将过滤器自动转换为查询。

您可以在 startDateendDate 上添加一个 'date' 过滤器,让用户使用它们进行过滤,或者实施一个或两个 custom ORM filters 来公开此内部逻辑API 消费者。