Преобразование построения запроса в собственный SQL с объединением - PullRequest
0 голосов
/ 27 мая 2019

Я сделал два запроса на подсчет с доктриной построения запроса, но после того, как обнаружил, что есть несколько повторяющихся запросов, поэтому я должен работать с 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 голосов
/ 31 мая 2019

Я бы настоятельно рекомендовал попытаться обработать ваш запрос в Doctrine, но если нативный является единственным способом, то он единственный.

Собственный SQL в Symfony: обратите внимание, я использую их в Symfony 3, но должен работатьв Symfony 4. Как только вы больше будете использовать Doctrine, вы обнаружите, что он действительно делает все, что может делать нативный, и некоторые вещи, которые он не делает, есть плагины для расширения возможностей Doctrine.Кроме того, один из способов обойти Unions - запустить два запроса, а затем объединить массивы.

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...