145

エラーが発生する次のコードがあります。

Message: Invalid parameter number: number of bound variables does not match number of tokens 

コード:

public function getCount($ids, $outcome)
{
    if (!is_array($ids)) {
        $ids = array($ids);
    }
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->add('select', $qb->expr()->count('r.id'))
       ->add('from', '\My\Entity\Rating r');
    if ($outcome === 'wins') { 
        $qb->add('where', $qb->expr()->in('r.winner', array('?1')));
    }
    if ($outcome === 'fails') {
        $qb->add('where', $qb->expr()->in('r.loser', array('?1')));
    }
    $qb->setParameter(1, $ids);
    $query = $qb->getQuery();
    //die('q = ' . $qb);
    return $query->getSingleScalarResult();
}

データ (または $ids):

Array
(
    [0] => 566
    [1] => 569
    [2] => 571
)

DQL 結果:

q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
4

14 に答える 14

389

これを行う最も簡単な方法は、配列自体をパラメーターとしてバインドすることです。

$queryBuilder->andWhere('r.winner IN (:ids)')
             ->setParameter('ids', $ids);
于 2012-08-08T22:42:38.123 に答える
123

この問題を調査したところ、同じ問題に遭遇し、解決策を探している人にとって重要なことがわかりました。

元の投稿から、次のコード行:

$qb->add('where', $qb->expr()->in('r.winner', array('?1')));

名前付きパラメーターを配列としてラップすると、バインドされたパラメーター番号の問題が発生します。配列のラッピングからそれを削除することにより:

$qb->add('where', $qb->expr()->in('r.winner', '?1'));

この問題は修正する必要があります。これは、Doctrine の以前のバージョンでは問題だった可能性がありますが、最新バージョンの 2.0 では修正されています。

于 2011-06-12T01:50:43.553 に答える
73

完成のために文字列ソリューション

$qb->andWhere('foo.field IN (:string)');
$qb->setParameter('string', array('foo', 'bar'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
于 2014-05-21T11:36:04.873 に答える
25

ドキュメントが示していることにもかかわらず、これを機能させる唯一の方法は次のようなものであることがわかりました。

$ids = array(...); // Array of your values
$qb->add('where', $qb->expr()->in('r.winner', $ids));

http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb

于 2011-05-10T14:21:10.340 に答える
18

古い投稿であることは知っていますが、誰かの役に立つかもしれません。intsに関するコメントで尋ねられた質問に対処することにより、@Daniel Espendillerの回答に投票して強化します

これを int に対して適切に機能させるには、配列の値が int 型であることを確認してください。渡す前に int に型キャストできます...

 $qb->andWhere('foo.field IN (:ints)');
 $qb->setParameter('ints', array(1, 2), 
 \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

symfony 3.4 および doctrine-bundle: 1.8 での選択/削除のテスト済み

于 2018-03-26T15:00:35.350 に答える
7

これは私がそれを使用した方法です:

->where('b.status IN (:statuses)')
->setParameters([
                'customerId' => $customerId,
                'storeId'    => $storeId,
                'statuses'   => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED]
            ]);
于 2016-02-09T16:02:57.120 に答える
7

2016 年にその方法を見つけました: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/

見積もり:

適切に行う方法は次のとおりです。

$em->createQuery(“SELECT users 
     FROM Entities\User users 
     WHERE 
         users.id IN (:userids)”)
->setParameters(
     array(‘userids’ => $userIds)
);

このメソッドsetParametersは、指定された配列を受け取り、「IN」ステートメントで使用するために適切に内破します。

于 2016-02-29T18:18:19.920 に答える
1
$qb->where($qb->expr()->in('r.winner', ':ids'))
    ->setParameter('ids', $ids);

以下にも対応:

$qb->andWhere($qb->expr()->in('r.winner', ':ids'))
    ->setParameter('ids', $ids);
于 2016-03-25T04:23:21.783 に答える