J'ai le code suivant qui me donne l'erreur:
Message: Invalid parameter number: number of bound variables does not match number of tokens
Code:
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();
}
Données (ou $ ids):
Array
(
[0] => 566
[1] => 569
[2] => 571
)
Résultat DQL:
q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
php
doctrine-orm
query-builder
Tjorriemorrie
la source
la source
Réponses:
En recherchant ce problème, j'ai trouvé quelque chose qui sera important pour quiconque rencontrant ce même problème et cherchant une solution.
À partir du message d'origine, la ligne de code suivante:
L'emballage du paramètre nommé en tant que tableau provoque le problème de numéro de paramètre lié. En le supprimant de son enveloppe de tableau:
Ce problème devrait être résolu. Cela a pu être un problème dans les versions précédentes de Doctrine, mais il est corrigé dans les versions les plus récentes de 2.0.
la source
$qb->expr()->in()
c'est seulement dans Doctrine 2 ORM, mais pas dans Doctrine DBAL.$qb->expr()->in()
est en effet à DBALLe moyen le plus simple de le faire est de lier le tableau lui-même en tant que paramètre:
la source
->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
setParameter
à forceConnection::PARAM_STR_ARRAY
et pour compléter la solution de chaîne
la source
J'ai trouvé que, malgré ce que la documentation indique, le seul moyen de faire fonctionner cela est comme ceci:
http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb
la source
Je sais que c'est un ancien message mais peut être utile pour quelqu'un. Je voterais et améliorerais la réponse de @Daniel Espendiller en répondant à la question posée dans les commentaires sur les ints
Pour que cela fonctionne correctement pour les int, assurez-vous que les valeurs du tableau sont de type int, vous pouvez taper cast en int avant de passer ...
Testé pour la sélection / suppression dans symfony 3.4 et doctrine-bundle: 1.8
la source
Je sais que l'exemple de l'OP utilise DQL et le générateur de requêtes, mais je suis tombé sur cela pour savoir comment le faire à partir d'un contrôleur ou en dehors de la classe de référentiel, alors peut-être que cela aidera les autres.
Vous pouvez également faire un à
WHERE IN
partir du contrôleur de cette façon:la source
La meilleure façon de procéder, surtout si vous ajoutez plus d'une condition, est:
Si votre tableau de valeurs contient des chaînes, vous ne pouvez pas utiliser la méthode setParameter avec une chaîne implosée, car vos guillemets seront échappés!
la source
Voici comment je l'ai utilisé:
la source
J'ai trouvé comment le faire en 2016: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/
Citation:
Voici comment le faire correctement:
La méthode
setParameters
prendra le tableau donné et l'implosera correctement pour être utilisé dans l'instruction «IN».la source
:userids
)Je préfère:
la source
Fonctionne également avec:
la source
J'ai eu du mal avec ce même scénario où je devais faire une requête sur un tableau de valeurs.
Ce qui suit a fonctionné pour moi:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause
Exemple de données de tableau (travaillé avec des chaînes et des entiers):
Exemple de requête (adaptez-vous là où vous en avez besoin):
la source
C'est des années plus tard, travaillant sur un ancien site ... Pendant toute ma vie, je n'ai pas pu faire fonctionner les solutions
->andWhere()
ou->expr()->in()
.Finalement regardé dans le repo Doctrine mongodb-odb et trouvé quelques tests très révélateurs:
Cela a fonctionné pour moi!
Vous pouvez trouver les tests sur github ici . Utile pour clarifier toutes sortes d'absurdités.
Remarque: ma configuration utilise Doctrine MongoDb ODM v1.0.dev pour autant que je sache.
la source