Doctrine DBAL - WHERE IN массив с дополнительным параметром

Используя пример docs, я смог получить такой запрос, чтобы он работал.

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

Используя DBAL, этот код возвращает результаты.

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

Я хотел бы найти f.foo как один целочисленный параметр, так как ищет инструкцию IN, но я не понял, как заставить его функционировать, поскольку все документы примера имеют массив как только параметр.

Ответы

Ответ 1

Параметры и типы являются параллельными массивами. Все, что вам нужно сделать, это добавить заполнитель для значения f.foo и добавить правильный тип PDO в аргументе 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();

Вы можете прочитать руководство для получения дополнительной информации.

Ответ 2

Я только что столкнулся с приведенным ниже поведением, поэтому я пишу это здесь, может быть, оно окажется полезным для кого-то еще.

Будьте осторожны при использовании именованных параметров с IN. Вам также придется повторить имена для массива типов:

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

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