【问题标题】:Doctrine setParameter and Invalid parameter number教义 setParameter 和无效参数号
【发布时间】: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] 不为空吗?

标签: php symfony doctrine-orm


【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 2016-02-05
        • 2012-06-13
        相关资源
        最近更新 更多