如何使用 Api 平台更改 Doctrine 最终查询?

问题描述

对于 Api Platform 和一个实体,我想更改最终查询

我已经知道 QueryCollectionExtensionInterface / QueryItemExtensionInterface (documentation) 但这只允许访问第一个表 (root) 而不是连接:

final class ConversationExtension implements QueryCollectionExtensionInterface,QueryItemExtensionInterface
{

    public function applyToCollection(
        QueryBuilder $queryBuilder,QueryNameGeneratorInterface
        $queryNameGenerator,string $resourceClass,string $operationName = null
    ): void {
        $this->addWhere($queryBuilder,$resourceClass);
    }

    public function applyToItem(
        QueryBuilder $queryBuilder,array $identifiers,string $operationName = null,array $context = []
    ): void {
        $this->addWhere($queryBuilder,$resourceClass);
    }

    private function addWhere(
        QueryBuilder $queryBuilder,string $resourceClass
    ): void {
        if (Conversation::class !== $resourceClass) {
            return;
        }

        dump($queryBuilder); // only root
        ...

也许 filters一个潜在客户,但我似乎无法弄清楚如何访问所有获取(集合和项目)的 QueryBuilder。

解决方法

我找到了解决问题的方法。我们必须将优先级更改为 -8 才能访问整个查询:

App\Extension\ConversationExtension:
    tags:
        - { name: api_platform.doctrine.orm.query_extension.collection,priority: -9 }
        - { name: api_platform.doctrine.orm.query_extension.item,priority: -9 }