symfony - 按同一表的相关实体进行的 Doctrine 查询扩展过滤器
问题描述
我在我的 Symfony 项目中使用 API 平台。
我有 3 个表:account / user / account_user
一个帐户可以有一个父帐户。当我 GET /accounts 时,我需要返回所有与当前用户相关的 account_user 帐户,并且我还需要返回这些帐户的子帐户。
我正在使用:API平台的扩展系统
这就是我的代码的样子:
$alias = $queryBuilder->getRootAliases()[0];
$queryBuilder
->innerJoin(sprintf('%s.accountUsers', $alias), 'au')
->innerJoin(sprintf('%s.parentAccount', $alias), 'pa')
->innerJoin(sprintf('%s.accountUsers', 'pa'), 'paau')
->andWhere($queryBuilder->expr()->orX(
'au.user = :current_user',
'paau.user = :current_user'
))
->setParameter('current_user', $currentUser)
;
我确信这是不正确的。我收到此错误:
“[语义错误] 第 0 行,'paaccountUsers_a2.user' 附近的第 487 列:错误:'paaccountUsers_a2' 未定义。”
我可以在这里使用一些帮助。谢谢你。
解决方案
最后,首先在子查询中获取父帐户的 ID,然后在 Where 子句中使用它进行实际查询,最终让它工作。
把它留在这里,这样它可以帮助某人:
$subQb = clone $queryBuilder;
$alias = $subQb->getRootAliases()[0];
$subQb->leftJoin(sprintf('%s.accountUsers', $alias), 'au')
->andWhere('au.user = :current_user')
->setParameter('current_user', $currentUser);
$subQuery = $subQb->getQuery();
$subQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, LimitSubqueryOutputWalker::class);
$foundIdRows = $subQuery->getScalarResult();
$ids = array_map('current', $foundIdRows);
if (empty($ids)) {
return;
}
$alias = $queryBuilder->getRootAliases()[0];
$queryBuilder->resetDQLPart('where');
$queryBuilder->setParameters(new ArrayCollection());
$queryBuilder->leftJoin(sprintf('%s.accountUsers', $alias), 'au');
$queryBuilder->andWhere($queryBuilder->expr()->orX(
sprintf('%s.parentAccount in (:ids)', $alias),
'au.user = :current_user'
))->setParameter('current_user', $currentUser)
->setParameter('ids', $ids);
推荐阅读
- google-api - Google Chat API (G Suite):请求包含无效参数(Node JS)
- javascript - 来自 AJAX JQUERY 对 XML 文件的调用的“未定义”错误响应
- javascript - 是否检查了第一个值并发布了第二个复选框值
- wcf - “ArrayOf ...” simpleWsdl WCF
- google-cloud-platform - gcloud cli 过滤器格式和限制行为
- linux - 用 STLINK 和 Linux 刷 ST 板
- python - 格式化 DataFrame 对象
- node.js - 在 Express 上设置多个静态目录
- java - 即使测试失败,如何始终写入 Jenkins Groovy 管道中的 .csv 数据文件
- azure - 带有 ServiceBus 的 Azure Functions:操作已取消