Użycie metody Yii w łańcuchu CDbCommand do zbudowania zapytania (jak w przypadku Uday Sawant's answer) jest ogólnie dobrym wyborem. W przypadku konieczności skonstruowania kwerendy fragmentaryczne nie jest idealna, dobrą alternatywą jest spłaszczyć szereg parametrów, więc NIE ochronę SQL injection bypass, tak:
$sql = "SELECT * FROM obj WHERE id IN (:id_array) AND other_field = :other_value";
$args = array(
'id_array' => array(1, 2, 3, 4, 5),
'other_value' => 12,
);
// Flatten array arguments into multiple parameters,
// replacing with parameter lists in the SQL
$newArgs = array();
$replace = array();
foreach($args as $oldKey => $input) {
if(!is_array($input)) {
$newArgs[$oldKey] = $args[$oldKey];
continue;
}
$replace[':'.$oldKey] = array();
foreach($input as $i => $value) {
$replace[':'.$oldKey][] = ':'.$oldKey.$i;
$newArgs[$oldKey.$i] = $value;
}
$replace[':'.$oldKey] = implode(', ', $replace[':'.$oldKey]);
}
$sql = strtr($sql, $replace);
$query = Yii::app()->db->createCommand($sql);
$query->params = $newArgs;
$query->queryAll();
W tym przykładzie, ostateczna sql i argumenty są:
SELECT * FROM obj WHERE id IN (:id_array0, :id_array1, :id_array2, :id_array3, :id_array4) AND other_field = :other_value
array(
'id_array0' => 1,
'id_array1' => 2,
'id_array2' => 3,
'id_array3' => 4,
'id_array4' => 5,
'other_value' => 12,
)
W projektach, w których z wykorzystaniem surowego SQL jest preferowany standard, największą zaletą jest to można zbierać w postaci funkcji użyteczności i używać go na każde zapytanie. Szkoda, że Yii nie rozszerza w ten sposób argumentów macierzy, ale możesz też dodać to wsparcie do projektów, które bezpośrednio używają PDO.
Uday Sawant's Odpowiedź jest dobre obejście. Powyższy kod faktycznie spowoduje, że instrukcja SQL: SELECT * FROM obj WHERE id IN (1,2,3,4,5). Zauważ, że wartość '$ inputs' jest ** pojedynczym ciągiem **. To sprawia, że wyniki są nieprawidłowe. Jeśli naprawdę musisz użyć 'bindValue', będziesz musiał zbudować SQL z tablic takich jak [this here] (http://stackoverflow.com/questions/6071619/pdo-bind-unknown-number-of-parameters). – Shiki