在Doctrine Criteria实例中,我有一些静态参数,我直接在查询中写入如下:
/**
* @return DoctrineCommonCollectionsCriteria
*/
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)
我在文档中找不到为什么没有使用我的静态参数。为了调试,我将静态值更改为绑定参数:
$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 DoctrineCommonCollectionsCriteria
*/
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 DoctrineORMQueryBuilder
* @throws DoctrineORMQueryQueryException
*/
public function getCurrentContratQB()
{
return $this->createQueryBuilder('contrat')
->addCriteria($this->lastContratCriteria());
}
/**
* @return DoctrineCommonCollectionsCollection
* @throws DoctrineORMQueryQueryException
*/
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();
}
为什么我不能在$criteria->expr()->eq()
中传递静态值?为什么Doctrine要求我使用查询属性的确切名称设置参数,而不是考虑我命名的参数?
您需要子查询的DQL将其添加到另一个查询生成器中,并公开原始参数名称。
尝试更换
->andWhere("c.id IN (". $this->contratRepository->getCurrentContratQB() .")")
带有
->andWhere("c.id IN (". $this->contratRepository->getCurrentContratQB()->getDQL() .")")
或
; $qb->andWhere($qb->expr()->in("c.id", $this->contratRepository->getCurrentContratQB()->getDQL())