Doctrine查询扩展按同表的相关实体过滤

问题描述 投票:0回答:1

我正在我的 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’未定义。”

我需要一些帮助。谢谢你。

php symfony doctrine api-platform.com dql
1个回答
0
投票

最终通过首先在子查询中获取父帐户的 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);
© www.soinside.com 2019 - 2024. All rights reserved.