Eu tenho o seguinte código que me dá o erro:
Message: Invalid parameter number: number of bound variables does not match number of tokens
Código:
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();
}
Dados (ou $ ids):
Array
(
[0] => 566
[1] => 569
[2] => 571
)
Resultado DQL:
q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
php
doctrine-orm
query-builder
Tjorriemorrie
fonte
fonte
Respostas:
Ao pesquisar esse problema, encontrei algo que será importante para quem se deparar com esse mesmo problema e procurar uma solução.
Na postagem original, a seguinte linha de código:
O agrupamento do parâmetro nomeado como uma matriz causa o problema do número do parâmetro vinculado. Removendo-o de seu empacotamento de matriz:
Este problema deve ser corrigido. Isso pode ter sido um problema nas versões anteriores do Doctrine, mas foi corrigido nas versões mais recentes do 2.0.
fonte
$qb->expr()->in()
está apenas no Doctrine 2 ORM, mas não no Doctrine DBAL.$qb->expr()->in()
está de fato em DBALA maneira mais fácil de fazer isso é vinculando a própria matriz como um parâmetro:
fonte
->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
setParameter
a forçaConnection::PARAM_STR_ARRAY
e para concluir a solução de cadeia
fonte
Descobri que, apesar do que os documentos indicam, a única maneira de fazer isso funcionar é assim:
http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb
fonte
Eu sei que é um post antigo, mas pode ser útil para alguém. Eu votaria e melhoraria a resposta de @Daniel Espendiller, abordando a pergunta feita nos comentários sobre ints
Para fazer isso funcionar corretamente para int's, verifique se os valores na matriz são do tipo int, você pode digitar cast para int antes de passar ...
Testado para selecionar / excluir no symfony 3.4 & doctrine-bundle: 1.8
fonte
Eu sei que o exemplo do OP está usando o DQL e o construtor de consultas, mas me deparei com isso procurando como fazê-lo a partir de um controlador ou fora da classe do repositório, então talvez isso ajude outras pessoas.
Você também pode fazer a
WHERE IN
partir do controlador desta maneira:fonte
A melhor maneira de fazer isso - especialmente se você estiver adicionando mais de uma condição - é:
Se sua matriz de valores contiver cadeias, você não poderá usar o método setParameter com uma cadeia implodida, porque suas aspas serão escapadas!
fonte
Foi assim que eu o usei:
fonte
Descobriu como fazer isso no ano de 2016: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/
Citar:
Aqui está como fazer isso corretamente:
O método
setParameters
pegará a matriz especificada e a implodirá adequadamente para ser usada na instrução "IN".fonte
:userids
)Eu prefiro:
fonte
Também trabalha com:
fonte
Lutei com esse mesmo cenário em que tive que fazer uma consulta contra uma matriz de valores.
O seguinte funcionou para mim:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause
Exemplo de dados de matriz (trabalhado com seqüências de caracteres e números inteiros):
Exemplo de consulta (adapte-se aonde você precisar):
fonte
Isso foi anos depois, trabalhando em um site herdado ... Durante toda a minha vida, não consegui colocar as soluções
->andWhere()
ou em->expr()->in()
funcionamento.Finalmente, procurei no repositório Doctrine mongodb-odb e encontrei alguns testes muito reveladores:
Funcionou para mim!
Você pode encontrar os testes no github aqui . Útil para esclarecer todo tipo de bobagem.
Nota: Minha configuração está usando o Doctrine MongoDb ODM v1.0.dev, na medida do possível.
fonte