首页 > 解决方案 > 按同一表的相关实体进行的 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' 未定义。”

我可以在这里使用一些帮助。谢谢你。

标签: symfonydoctrinedqlapi-platform.com

解决方案


最后,首先在子查询中获取父帐户的 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);

推荐阅读