问题描述
对于 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 }