Tengo el siguiente código que me da el error:
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();
}
Datos (o $ 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
fuente
fuente
Respuestas:
Al investigar este problema, encontré algo que será importante para cualquiera que se encuentre con este mismo problema y busque una solución.
De la publicación original, la siguiente línea de código:
Ajustar el parámetro con nombre como una matriz causa el problema del número del parámetro vinculado. Al eliminarlo de su envoltorio de matriz:
Este problema debe ser solucionado. Esto podría haber sido un problema en versiones anteriores de Doctrine, pero se solucionó en las versiones más recientes de 2.0.
fuente
$qb->expr()->in()
solo está en Doctrine 2 ORM, pero no en Doctrine DBAL.$qb->expr()->in()
está de hecho en DBALLa forma más fácil de hacerlo es enlazando la matriz como un parámetro:
fuente
->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
setParameter
a forzarConnection::PARAM_STR_ARRAY
y para completar la solución de cadena
fuente
Descubrí que, a pesar de lo que indican los documentos, la única forma de hacer que esto funcione es así:
http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb
fuente
Sé que es una publicación antigua, pero puede ser útil para alguien. Yo votaría y mejoraría la respuesta de @Daniel Espendiller abordando la pregunta que se hace en los comentarios sobre ints
Para que esto funcione para int de manera adecuada, asegúrese de que los valores en la matriz sean del tipo int, puede escribir cast to int antes de pasar ...
Probado para seleccionar / eliminar en Symfony 3.4 y doctrine-bundle: 1.8
fuente
Sé que el ejemplo del OP está usando DQL y el generador de consultas, pero me topé con esto buscando cómo hacerlo desde un controlador o fuera de la clase de repositorio, por lo que tal vez esto ayude a otros.
También puede hacer una
WHERE IN
desde el controlador de esta manera:fuente
La mejor manera de hacerlo, especialmente si agrega más de una condición, es:
Si su matriz de valores contiene cadenas, no puede usar el método setParameter con una cadena implosionada, ¡porque sus comillas se escaparán!
fuente
Así es como lo usé:
fuente
Encontró cómo hacerlo en el año 2016: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/
Citar:
Aquí está cómo hacerlo correctamente:
El método
setParameters
tomará la matriz dada y la implosionará adecuadamente para usarla en la declaración "IN".fuente
:userids
)Yo prefiero:
fuente
También funciona con:
fuente
Luché con este mismo escenario en el que tuve que hacer una consulta contra una matriz de valores.
Lo siguiente funcionó para mí:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause
Ejemplo de datos de matriz (trabajado con cadenas y enteros):
Ejemplo de consulta (Adaptarse a donde lo necesita):
fuente
Se trata de años más tarde, trabajando en un sitio de memoria ... Para la vida de mí no podía conseguir la
->andWhere()
o->expr()->in()
las soluciones de trabajo.Finalmente busqué en el repositorio de Doctrine mongodb-odb y encontré algunas pruebas muy reveladoras:
¡Funcionó para mí!
Puedes encontrar las pruebas en github aquí . Útil para aclarar todo tipo de tonterías.
Nota: Mi configuración está usando Doctrine MongoDb ODM v1.0.dev hasta donde puedo entender.
fuente