2013-04-15 33 views
7

经过多次尝试,我想我终于知道文档的内心。 然后,我需要你们的帮助。我不明白为什么学说告诉我这个错误:主义setParameter和无效的参数号

非法参数编号:绑定变量的数量不符 令牌数量

这里我的代码:

$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(); 

非常感谢您的回答。

+6

你可能打电话给$ db->以后在哪里?这将覆盖现有的where语句。 – sroes

+0

不,这是where语句的唯一用法。 –

+0

'$ marque'和'$ matchesNumber [1]'是否为空? – cheesemacfly

回答

7

我很抱歉..我刚刚发现我的错误..后来,在我的代码更晚的时候..我用我的旧“$ qb”键入一个新的查询.. 我真是一个小菜!

+0

@sroes was那么:) – Ejaz

+0

准确!他是对的^^ –

8

我推测 - > setParameter覆盖了前一个。

对于多个参数使用:

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

见学说升级:

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

Doctrine Upgrade Description

也许这也适用于的setParameter?

+0

我已经尝试' - > setParameters(['marque'=> $ marque,'magasin'=>'%'。$ matchesNumber [1]。'%']);'但没有更改。 –

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(); 
10

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

希望这可以帮助别人。

相关问题