教义 setParameter 和无效参数号

Posted

技术标签:

【中文标题】教义 setParameter 和无效参数号【英文标题】:Doctrine setParameter and Invalid parameter number 【发布时间】:2013-04-15 14:28:49 【问题描述】:

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

提前感谢您的回答。

【问题讨论】:

你可能会在稍后调用 $db->where 吗?这将覆盖现有的 where 语句。 不,这是 where 语句的唯一用途。 $marque$matchesNumber[1] 不为空吗? 【参考方案1】:

如果您不小心使用了多个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');

希望这对某人有所帮助。

【讨论】:

【参考方案2】:

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

对于多个参数使用:

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

参见教义升级:

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

Doctrine Upgrade Description

也许这也适用于 setParameter?

【讨论】:

我已经尝试过-&gt;setParameters(['marque' =&gt; $marque, 'magasin' =&gt; '%'.$matchesNumber[1].'%']); 但没有任何变化..【参考方案3】:

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

【讨论】:

【参考方案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();

【讨论】:

以上是关于教义 setParameter 和无效参数号的主要内容,如果未能解决你的问题,请参考以下文章

教义错误“无效的参数号:绑定变量的数量与标记的数量不匹配”

教义 queryBuilder setParamater

Symfony 4,Postgres - 在运行教义命令时`参数“client_encoding”的无效值:“utf8mb4”`

机器视觉 dev_map_par算子

从简单的HQL查询中获取无效的参数索引1

setAttribute和setParameter方法的区别