2014-05-08 18 views
15

Utilizzando i documenti di esempio, sono riuscito a ottenere una query come questa per funzionare.DBAL Doctrine - WHERE IN array con parametro aggiuntivo

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

Utilizzando DBAL, questo codice restituisce risultati.

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

vorrei cercare f.foo come un unico parametro intero oltre che alla ricerca per l'istruzione, ma non ho capito come farlo funzionare, dal momento che tutti i documenti sono di esempio la matrice come unico parametro.

risposta

20

I parametri e i tipi sono array paralleli. Tutto quello che dovresti fare è aggiungere il tuo segnaposto per il valore f.foo e aggiungere il tipo di PDO corretto nell'argomento tipi.

$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(); 

È possibile read il manuale per maggiori informazioni.

+0

Perfetto! Questo è ESATTAMENTE quello che sto cercando di fare. – Zoot

11

Ho appena incontrato il comportamento di seguito, quindi lo sto scrivendo qui, forse si rivelerà utile per qualcun altro.

non è possibile utilizzare i parametri denominati con IN, quindi questo codice non funzionerà:

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

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

Quanto sopra per fortuna funziona bene ora, dal momento che almeno DBAL 2.6 (forse prima) – inanimatt

Problemi correlati