7

经过多次尝试,我想我终于把文档牢记在心了。然后,我需要你的帮助.. 我不明白为什么 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

4 回答 4

12

如果您不小心使用了多个 ,也会发生这种情况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');

希望这可以帮助某人。

于 2017-03-24T23:16:57.943 回答
8

我认为 ->setParameter 会覆盖前一个。

对于多个参数使用:

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

见教义升级:

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

教义升级说明

也许这也适用于 setParameter?

于 2013-04-15T14:55:28.567 回答
7

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

于 2013-04-15T15:32:44.987 回答
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();
于 2014-03-14T11:41:25.367 回答