Symfonyでチェックボックスにはまる(Symfony1.2)
2009年11月03日(火)10:09|天方
こんにちは、天方です。
チェックボックスにはまるってなんだと思われたかもしれませんが、 このまえ、Symfony1.2のAdmin Generatorでチェックボックスを一覧の検索条件につかったらハマりました。
なにかというと、Admin Generatorを使って生成した一覧の検索条件として、チェックボックスを利用して、かつ複数項目を選択できるようにした場合に挙動が予期していたものと違ったのです。
やってることがトリッキーなので、動作が想定と違うのはしょうがないのですが、普通、検索条件の入力項目は入力項目の種類ごとにANDになってほしいのですが、今回の場合、ORで条件が結合されてしまうという問題でした。
どういうことかというと、下記のようにチェックボックスと[テキスト]の入力フォームがあった場合、
条件A □foo □bar 条件B [テキスト]
条件として、fooとbarにチェックするのであれば、
SQL的には
他の条件 AND 条件Aのカラム IN ('foo', 'bar') AND 条件Bのカラム LIKE 'テキスト'
となってほしいのですが、
他の条件 OR 条件Aのカラム IN ('foo', 'bar') AND 条件Bのカラム LIKE 'テキスト'
とかなるんです。
よく見るとsfFormFilterDoctrine.class.phpで
protected function addForeignKeyQuery(Doctrine_Query $query, $field, $value)
{
$fieldName = $this->getFieldName($field);
if (is_array($value))
{
$query->orWhereIn('r.' . $fieldName, $value);
}
else
{
$query->addWhere('r.' . $fieldName . ' = ?', $value);
}
}
となっているところが問題のようです。
とりあえず、こちらの処理そのもののバグかどうかはわからないので、自分のつかっているフィルタークラスに
protected function addForeignKeyQuery(Doctrine_Query $query, $field, $value)
{
$fieldName = $this->getFieldName($field);
if (is_array($value))
{
// 元のソースコードだとorWhereInとなっていたのでオーバーライド
$query->andWhereIn('r.' . $fieldName, $value);
}
else
{
$query->addWhere('r.' . $fieldName . ' = ?', $value);
}
}
と指定して解決しました。