Ich habe den folgenden Code, der mir den Fehler gibt:
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();
}
Daten (oder $ ids):
Array
(
[0] => 566
[1] => 569
[2] => 571
)
DQL-Ergebnis:
q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
php
doctrine-orm
query-builder
Tjorriemorrie
quelle
quelle
Antworten:
Bei der Untersuchung dieses Problems habe ich etwas gefunden, das für jeden wichtig ist, der auf dasselbe Problem stößt und nach einer Lösung sucht.
Aus dem ursprünglichen Beitrag die folgende Codezeile:
Das Umschließen des benannten Parameters als Array verursacht das Problem mit der gebundenen Parameternummer. Durch Entfernen aus dem Array-Wrapping:
Dieses Problem sollte behoben sein. Dies war möglicherweise ein Problem in früheren Versionen von Doctrine, wurde jedoch in den neuesten Versionen von 2.0 behoben.
quelle
$qb->expr()->in()
ist nur in Doctrine 2 ORM, aber nicht in Doctrine DBAL.$qb->expr()->in()
ist in der Tat in DBALDer einfachste Weg, dies zu tun, besteht darin, das Array selbst als Parameter zu binden:
quelle
->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
setParameter
an Force zu übergebenConnection::PARAM_STR_ARRAY
und zur Vervollständigung die String-Lösung
quelle
Ich fand heraus, dass trotz der Angaben in den Dokumenten der einzige Weg, dies zum Laufen zu bringen, folgender ist:
http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb
quelle
Ich weiß, dass es ein alter Beitrag ist, kann aber für jemanden hilfreich sein. Ich würde die Antwort von @Daniel Espendiller abstimmen und verbessern, indem ich die Frage beantworte, die in Kommentaren zu Ints gestellt wird
Damit dies für Ints ordnungsgemäß funktioniert, stellen Sie sicher, dass die Werte im Array vom Typ int sind. Sie können cast to int eingeben, bevor Sie ...
Getestet auf Auswählen / Löschen in Symfony 3.4 & Doctrine-Bundle: 1.8
quelle
Ich weiß, dass das Beispiel des OP DQL und den Abfrage-Generator verwendet, aber ich bin darauf gestoßen, wie man es von einem Controller oder außerhalb der Repository-Klasse aus macht. Vielleicht hilft dies anderen.
Sie können eine
WHERE IN
vom Controller auch folgendermaßen ausführen:quelle
Der beste Weg, dies zu tun - insbesondere wenn Sie mehr als eine Bedingung hinzufügen - ist:
Wenn Ihr Wertearray Zeichenfolgen enthält, können Sie die setParameter-Methode nicht mit einer implodierten Zeichenfolge verwenden, da Ihre Anführungszeichen maskiert werden!
quelle
So habe ich es benutzt:
quelle
So wurde es im Jahr 2016 gemacht: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/
Zitat:
So geht's richtig:
Die Methode
setParameters
nimmt das angegebene Array und implodiert es ordnungsgemäß, um es in der Anweisung "IN" zu verwenden.quelle
:userids
)Ich bevorzuge:
quelle
Funktioniert auch mit:
quelle
Ich hatte mit demselben Szenario zu kämpfen, in dem ich eine Abfrage für ein Array von Werten durchführen musste.
Folgendes hat bei mir funktioniert:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause
Beispiel für Array-Daten (mit Zeichenfolgen und Ganzzahlen gearbeitet):
Abfragebeispiel (An den gewünschten Ort anpassen):
quelle
Dies ist Jahre später, als ich an einer Legacy-Site arbeite ... Für mein Leben konnte ich die
->andWhere()
oder->expr()->in()
Lösungen nicht zum Laufen bringen.Schließlich schaute in der Doctrine Mongodb-Odb Repo und fand einige sehr aufschlussreiche Tests:
Es hat bei mir funktioniert!
Die Tests auf Github finden Sie hier . Nützlich, um alle Arten von Unsinn zu klären.
Hinweis: Mein Setup verwendet Doctrine MongoDb ODM v1.0.dev, soweit ich das beurteilen kann.
quelle