Как правильно привязать параметры к методу Doctrine Criteria expr ()? - PullRequest
0 голосов
/ 17 февраля 2020

В экземпляре Doctrine Criteria у меня есть некоторые параметры stati c, которые я написал непосредственно в запросе, как показано ниже:

    /**
     * @return \Doctrine\Common\Collections\Criteria
     */
    public function lastContratCriteria()
    {
        $criteria = Criteria::create();

        $baseCondition = $criteria->expr()->andX(
          $criteria->expr()->eq('BaseType', 1), // STATIC VALUE 
          $criteria->expr()->orX(
            $criteria->expr()->gt('dateFinContractuellePrevue','CURRENT_DATE()'), // STATIC VALUE 
            $criteria->expr()->isNull('dateFinContractuellePrevue')
          )
        );

        $criteria
          ->andWhere($baseCondition)
          ->orderBy(['dateDebut' => 'DESC'])
          ->setMaxResults(1);

        return $criteria;
    }

Но это выдает:

QueryException: Слишком мало параметров: запрос определяет 2 параметра, но вы связали 0 .

Это вывод DQL, где вы можете увидеть связанные параметры на основе имени свойства ( который я не определил):

WHERE contrat.BaseType = :BaseType AND (contrat.dateFinContractuellePrevue > :dateFinContractuellePrevue OR contrat.dateFinContractuellePrevue IS NULL)

Я не мог найти в документах, почему мои параметры stati c не использовались. Для отладки я изменил значения stati c на связанные параметры:

     $baseCondition = $criteria->expr()->andX(
          $criteria->expr()->eq('BaseType', ':bType'),
          $criteria->expr()->orX(
            $criteria->expr()->gt('dateFinContractuellePrevue',':dateFinCP'),
            $criteria->expr()->isNull('dateFinContractuellePrevue')
          )
     );

Но Независимо от того, как я назвал параметры , чтобы он работал, мне приходилось вызывать каждый из них в setParameter() с соответствующим ему именем свойства вместо пользовательского имени, которое я выбираю:

->setParameter('BaseType', 1) // Should be bType as above, not BaseType ?
->setParameter('dateFinContractuellePrevue', 'CURRENT_DATE()') // Should be :dateFinCP ?

Вот полный запрос:


    /**
     * @return \Doctrine\Common\Collections\Criteria
     */
    public function lastContratCriteria()
    {
        $criteria = Criteria::create();

        $baseCondition = $criteria->expr()->andX(
          $criteria->expr()->eq('BaseType', ':bType'),
          $criteria->expr()->orX(
            $criteria->expr()->gt('dateFinContractuellePrevue',':dateFinCP'),
            $criteria->expr()->isNull('dateFinContractuellePrevue')
          )
        );
    }

    /**
     * @return \Doctrine\ORM\QueryBuilder
     * @throws \Doctrine\ORM\Query\QueryException
     */
    public function getCurrentContratQB()
    {
        return $this->createQueryBuilder('contrat')
              ->addCriteria($this->lastContratCriteria());
    }

    /**
     * @return \Doctrine\Common\Collections\Collection
     * @throws \Doctrine\ORM\Query\QueryException
     */
    public function getSeminaire()
    {
        $qb = $this->createQueryBuilder('salarie')
          ->andWhere('salarie.archive = FALSE')

          ->leftJoin('salarie.contrats', 'c')
          ->addSelect('c') 

          ->andWhere("c.id IN (". $this->contratRepository->getCurrentContratQB() .")")

          //  ONLY ORIGINAL FIELD NAME IS RECOGNIZED HERE, not the bound parameter name
          ->setParameter('BaseType', 1) // Should be bType, not BaseType
          ->setParameter('dateFinContractuellePrevue', 'CURRENT_DATE()') // Should be :dateFinCP

        //dump($qb->getDQL());

        return $qb->getQuery()
          ->getResult();
    }

Почему я не могу передать значения c в $criteria->expr()->eq()? Почему Doctrine требует от меня установки параметров с точным именем запрашиваемого свойства вместо того, чтобы заботиться о параметрах, которые я назвал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...