Lehre - Wie man bind-array, um die SQL?
Mein SQL sieht ungefähr so aus:
$sql = "select * from user where id in (:userId) and status = :status";
$em = $this->getEntityManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue(':userId', $accounts, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);
$stmt->bindValue(':status', 'declined');
$stmt->execute();
$result = $stmt->fetchAll();
Aber es gibt:
Eine Ausnahme während der Ausführung (...)
mit params
[[1,2,3,4,5,6,7,8,11,12,13,14], "abgelehnt"]Hinweis: Arrays zu-string-Konvertierung
Kann ich nicht Benutzer queryBuilder
weil mein echtes SQL ist komplizierter (ex. enthält beigetreten auswählen, Gewerkschaften und so weiter)
- Können Sie foreach verwenden?
foreach($accounts as $key => $val) { $stmt->bindValue(':userId', $val); }
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden vorbereitete Anweisungen, die mit arrays einfach, da sql selbst unterstützt keine arrays. Das ist eine echte Schande. Irgendwo entlang der Linie, die Sie tatsächlich benötigen, um zu bestimmen, wenn Ihre Daten enthält, sagen drei Gegenstände aus und gibt eine IN (?,?,?). Die Lehre ORM entity-manager tut dies für Sie automatisch.
Glücklicherweise die DBAL hat Sie bedeckt. Sie einfach nicht mit binden oder vorzubereiten. Das manual ist ein Beispiel: https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
In deinem Fall würde es so Aussehen:
Dem obigen code ist ungetestet, aber sollte man auf die Idee kommen. (Stellen Sie sicher, dass Sie
use Doctrine\DBAL\Connection;
fürConnection::PARAM_INT_ARRAY
)Hinweis für Leute, die benannte Parameter verwenden:
Wenn Sie benannte Parameter verwenden (
:param
statt?
), Sie sollte den parameter-Namen bei der Bereitstellung von Arten. Zum Beispiel:[Semantical Error] line 0, col 52 near 'SELECT r0_.id': Error: Class 'SELECT' is not defined.
. Könnten Sie mir bitte helfen mit diesem?Wenn Sie möchten, zu bleiben, um die
:param
- syntax, wobei die Reihenfolge keine Rolle, haben Sie zu tun, ein wenig zusätzliche Arbeit, aber ich zeige Ihnen einen einfacheren Weg, binden Sie die Parameter:In diesem Fall werden wir am Ende mit:
"select * from user where id in (:id_0,:id_1,:id_2,:id_3) and status = :status"
Dieser Ansatz wird auch die Arbeit mit einem array von strings.
Müssen Sie wickeln Sie Sie in ein array
http://doctrine-dbal.readthedocs.io/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
Bearbeiten
Ich soll ausgearbeitet haben mehr. Sie können nicht binden eines array so, dont prepare sql execute direkt, wie das Beispiel in der Dokumentation.
Warning: PDOStatement::bindValue() expects parameter 3 to be integer, array given
. Ich bin mitprepare
Methode, nichtexecuteQuery