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
]
);