В экземпляре 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 требует от меня установки параметров с точным именем запрашиваемого свойства вместо того, чтобы заботиться о параметрах, которые я назвал?