使用联合将查询构建转换为本机SQL

时间:2019-05-27 10:20:42

标签: symfony doctrine query-builder native-sql

我使用查询构建学说进行了两次计数查询,但是发现重复执行了几个查询计数后,我必须与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();

    }

1 个答案:

答案 0 :(得分:0)

我强烈建议您尝试在教义中计算您的查询,但是如果只有本机,那么这是唯一的方法。

Symfony中的本机SQL:请注意,我在Symfony 3中使用了这些,但应在Symfony 4中使用。一旦您对Doctrine有了更多的使用,您会发现它确实可以完成本机可以做的一切,而某些它不能做的事则有可用的插件。扩展教义的能力。另外,解决Union的一种方法是运行两个查询,然后合并数组。

$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();