web-dev-qa-db-ja.com

Doctrine DBAL-追加パラメーターを含むWHERE IN配列

サンプルドキュメントを使用して、このようなクエリを機能させることができました。

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ステートメントも検索したいのですが、すべてのサンプルドキュメントには配列が唯一のパラメーターとして含まれているため、それを機能させる方法がわかりません。

23
Zoot

パラメータとタイプは並列配列です。必要なのは、f.foo値のプレースホルダーを追加し、types引数に正しいPDOタイプを追加することだけです。

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

詳細は read マニュアルを参照してください。

30
Mathew Peterson

以下の動作に遭遇したばかりなので、ここに書いています。おそらく他の人にとって役に立つかもしれません。

INで名前付きパラメーターを使用する場合は注意してください。 type-arrayの名前も繰り返す必要があります。

$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