Doctrine setParameter和无效的参数号

时间:2013-04-15 14:28:49

标签: php symfony doctrine-orm

经过多次尝试,我想我终于明白了文档。 然后,我需要你的帮助..我不明白为什么Doctrine告诉我这个错误:

  

参数号无效:绑定变量数不匹配   令牌数量

这是我的代码:

$qb = $this->em->createQueryBuilder();
$qb->select('m')
   ->from('Entities\Marque', 'm')
   ->leftJoin('m.magasin', 'ma')
   ->where('m.nom = :marque AND ma.nom LIKE :magasin')
   ->setParameter('marque', $marque)
   ->setParameter('magasin', '%'.$matchesNumber[1].'%');
$results = $qb->getQuery()->getArrayResult();

提前感谢您的回答。

4 个答案:

答案 0 :(得分:11)

如果您不小心使用了多个where(),这种情况也会发生在我身上。

$em    = $this->getEntityManager();
$query = $em->createQueryBuilder()
    ->from('AppBundle:SomeEntity', 's')
    ->select('s')
    ->where('s.foo = :foo')
    ->where('s.bar = :bar') // <- HERE
    ->setParameter('foo', 'Foo Value')
    ->setParameter('bar', 'Bar Value');

应该是:

$em    = $this->getEntityManager();
$query = $em->createQueryBuilder()
    ->from('AppBundle:SomeEntity', 's')
    ->select('s')
    ->where('s.foo = :foo')
    ->andWhere('s.bar = :bar') // <- CHANGE TO andWhere()
    ->setParameter('foo', 'Foo Value')
    ->setParameter('bar', 'Bar Value');

希望这有助于某人。

答案 1 :(得分:8)

我认为 - &gt; setParameter会覆盖前一个。

对于多个参数,请使用:

->setParameters(['key1' => $value1, 'key2' => $value2])

请参阅Doctrine升级:

  

从现在开始,查询中的参数是ArrayCollection而不是简单数组。这&gt;严重影响了setParameters()的使用,因为它不再追加参数&gt;来查询,但实际上会覆盖已定义的参数。每当您检索&gt;参数时(即。$ query-&gt; getParameter(1))

Doctrine Upgrade Description

也许这也适用于setParameter?

答案 2 :(得分:7)

我很抱歉..我刚刚发现了我的错误..稍后,就像我的代码稍后一样..我用旧的“$ qb”键入一个新查询.. 我是个菜鸟!

答案 3 :(得分:4)

$qb = $this->em->createQueryBuilder();
$parameters = array('marque'=>$marque, 'magasin'=>'%'.$matchesNumber[1].'%');
$qb->select('m')
   ->from('Entities\Marque', 'm')
   ->leftJoin('m.magasin', 'ma')
   ->where('m.nom = :marque')
   ->andWhere('ma.nom LIKE :magasin')
   ->setParameters($parameters);

$results = $qb->getQuery()->getArrayResult();