如何将参数正确绑定到Doctrine Criteria exp()方法



在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())

最新更新