0

我使用查询构建原则进行了两次计数查询,但是在我发现有几个重复的查询计数之后,我必须使用 UNION 但在原则查询构建中没有联合。

所以解决方案是使用原生 SQL 和 UNION。

我不知道如何在本地查询中进行翻译

这是我的要求 1

/**
     * @param Analyse $analyse
     * @return mixed
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function countTotalErrorByIdAnalyse(Analyse $analyse)
    {
        return $this->createQueryBuilder('a')
                    ->select('count(a)')
                    ->innerJoin('a.analyse', 'analyse')
                    ->where('analyse.id = :analyse')
                    ->setParameter('analyse', $analyse->getId())
                    ->getQuery()
                    ->getSingleScalarResult();

       
    }

这是我的要求 2

 /**
     * @param Analyse $analyse
     * @param string $severity
     * @return mixed
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function countErrorsBySeverity(Analyse $analyse, string $severity){

      return   $this->createQueryBuilder('a')
                    ->select('count(a)')
                    ->innerJoin('a.analyse', 'analyse')
                    ->innerJoin('a.rule', 'rule')
                    ->where('rule.severity = :error')
                    ->setParameter('error', $severity)
                    ->getQuery()
                    ->getSingleScalarResult();

    }

4

1 回答 1

0

我强烈建议尝试在 Doctrine 中解决您的查询,但如果本地是唯一的方法,那么它就是唯一的方法。

Symfony 中的原生 SQL:注意我在 Symfony 3 中使用了这些,但应该在 Symfony 4 中工作。一旦你更多地使用 Doctrine,你会发现它确实可以完成原生可以做的所有事情,而有些项目它不能做有插件可用于扩展 Doctrine 的能力。此外,绕过联合的一种方法是运行两个查询,然后组合数组。

$em = $this->getDoctrine()->getManager();
$sql = "SELECT .. FROM .. WHERE .. ";
$result = $em->getConnection()->prepare($sql);
$result->execute();

另一种选择是使用存储库:注意这使用了 Doctrine,因此所有 Doctrine 规则都适用。

    $sql =
        "
        SELECT
            ...
        FROM
            App:EntityName alias
        WHERE
            ...
        "
    ;
    $query = $this->getEntityManager()->createQuery($sql);
    $results = $query->getResult();
于 2019-05-31T00:12:39.313 回答