我正在我的 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 行,第 487 列,靠近‘paaccountUsers_a2.user’:错误:‘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);