Bug(バグ) #3339
Yuya Watanabe さんが11年以上前に更新
h3. 概要
Doctrine で WHERE IN を用いたサブクエリの場合に配列が正しく展開されない.
厳密にいうと WHERE IN でなくともサブクエリに配列を指定する場合に正しく展開されない.
<pre>
$q = Doctrine_Core::getTable('MemberConfig')->createQuery('c');
$q->andWhere('c.member_id IN (SELECT m.id FROM Member m WHERE m.id IN ?)', array(array('1', '2')));
$q->execute();
</pre>
発行される SQL は下記の通り
<pre>
SELECT m.id AS m__id, m.member_id AS m__member_id, m.name AS m__name, m.value AS m__value, m.value_datetime AS m__value_datetime, m.name_value_hash AS m__name_value_hash, m.created_at AS m__created_at, m.updated_at AS m__updated_at FROM member_config m WHERE (m.member_id IN (SELECT m2.id AS m2__id FROM member m2 WHERE (m2.id IN (?, ?))) AND (m2.is_active = ? OR m2.is_active IS NULL))
</pre>
エラー
<pre>
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
</pre>
サブクエリ部分に着目すると,WHERE IN のパラメータホルダは2つあり,正しく展開されている.
注意) #3135 のバグにより,WHERE IN を用いた部分がサブクエリでない場合はパラメータホルダは 1 つになるバグがある.今回はサブクエリのため関係ない.
<pre>
WHERE (m2.id IN (?, ?))) AND (m2.is_active = ? OR m2.is_active IS NULL))
</pre>
実際に渡されるパラメータは下記のような構成になっており,配列となっている部分が存在する.この部分が 'Array' となり,パラメータとの数があわないという状態になると思われる.
<pre>
array(2) {
[0] =>
array(2) {
[0] =>
string(1) "1"
[1] =>
string(1) "2"
}
[1] =>
int(1)
}
</pre>