2014-05-08 5 views
15

Mit den Beispieldokumenten konnte ich eine Abfrage wie diese zum Funktionieren bekommen.Doktrin DBAL - WHERE IN Array mit zusätzlichen Parameter

SELECT 
f.foo, 
b.bar 
FROM Foo f 
LEFT JOIN Bar b 
WHERE 
f.foo = 20 
AND b.bar IN ? 

Mit DBAL gibt dieser Code Ergebnisse zurück.

$result = $this->connection->executeQuery(
      $SQL, 
      array($bar_array), 
      array(\Doctrine\DBAL\Connection::PARAM_INT_ARRAY) 
     )->fetchAll(); 

Ich möchte für f.foo als einzelne Integer-Parameter, wie der Suche nach der IN-Anweisung auch suchen, aber ich habe nicht herausgefunden, wie sie da alle Beispieldokumente funktionieren zu erhalten, müssen das Array als einziger Parameter.

Antwort

20

Die params und Typen sind parallel Arrays. Sie müssen lediglich Ihren Platzhalter für den f.foo-Wert hinzufügen und den richtigen PDO-Typ in types Argument hinzufügen.

$SQL = "SELECT f.foo, b.bar 
     FROM Foo f LEFT JOIN Bar b 
     WHERE f.foo = ? AND b.bar IN (?)"; 

$result = $this->connection 
    ->executeQuery($SQL, array($foo, $bar_array),array(
      \PDO::PARAM_INT, 
      \Doctrine\DBAL\Connection::PARAM_INT_ARRAY 
    ))->fetchAll(); 

Sie können read das Handbuch für weitere Informationen.

+0

Perfect! Das ist genau das, was ich versuche zu tun. – Zoot

11

Ich traf nur das unten stehende Verhalten, so dass ich es hier schreibe, vielleicht wird es für jemand anderen als nützlich erweisen.

Sie können nicht benannte Parameter mit IN verwenden, so dass dieser Code nicht funktionieren:

$sql = "SELECT * FROM myTable WHERE name IN (:param_array)"; 

$stmt = $this->db->executeQuery(
     $sql, 
     [ 
      'param_array' => $paramArray 
     ], 
     [ 
      Connection::PARAM_STR_ARRAY 
     ] 
    ); 
+1

Das obige funktioniert glücklicherweise gut, seit mindestens DBAL 2.6 (möglicherweise früher) – inanimatt