web-dev-qa-db-fra.com

Doctrine DBAL - WHERE IN array avec paramètre supplémentaire

En utilisant les documents d'exemple, j'ai pu faire fonctionner une requête comme celle-ci.

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

À l'aide de DBAL, ce code renvoie des résultats.

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

Je voudrais rechercher f.foo en tant que paramètre entier unique et rechercher l'instruction IN, mais je n'ai pas compris comment le faire fonctionner, car tous les exemples de documents ont le tableau comme seul paramètre.

23
Zoot

Les paramètres et les types sont des tableaux parallèles. Tout ce que vous devez faire est d'ajouter votre espace réservé pour la valeur f.foo et d'ajouter le bon type PDO dans l'argument types.

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

Vous pouvez lire le manuel pour plus d'informations.

30
Mathew Peterson

Je viens de rencontrer le comportement ci-dessous, donc je l'écris ici, peut-être qu'il s'avérera utile pour quelqu'un d'autre.

Méfiez-vous lorsque vous utilisez des paramètres nommés avec IN. Vous devrez également répéter les noms du tableau de types:

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

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