Pешение «в лоб»

$ids = array(1, 2, 3);
$dataProvider=new CActiveDataProvider('User',array(
    'criteria'=>array(
        'condition'=>'id IN ('.implode(',', $ids).')',
    )
));
 
$this->render('admin',array(
    'model'=>$dataProvider,
));

Говнокод выглядит не очень красиво; если массив $ids окажется пустым, возникнет ошибка; полученные значения нужно проверить. Далее решение с помощью библиотеки Yii.

$model = User::model()->findAllByAttributes(array('id'=>array(1, 2, 3)));
$dataProvider=new CActiveDataProvider('User');
$dataProvider->setData($model);
 
$this->render('index',array(
    'dataProvider'=>$dataProvider,
));
Метод findAllByAttributes класса CActiveRecord позволяет искать записи в БД по названию поля и значению. При этом если значение является массивом, то используется оператор IN. Этот же самый код можно записать немного иначе.
$dataProvider=new CActiveDataProvider('User');
$dataProvider->criteria->addInCondition('id', array(1,2,3));
 
$this->render('index',array(
    'dataProvider'=>$dataProvider,
));
 
**Тестируем**
Попробуем в массиве передать строку.
$dataProvider->criteria->addInCondition('id', array(1,2,'test'));
В результате будет выполнен следующий запрос.   
SELECT * FROM 'tbl_user' WHERE "id" IN (1, 2, 0)
Т.е. текстовое значение было заменено нулем, что вполне логично, т.к. поле id имеет тип INT.
Если запрос будет выполняться к полю текстового типа, то текстовые и числовые значения будут вставлены в кавычках.
 
$dataProvider->criteria->addInCondition('id', array(1, 'admin','user'));
сформирует такой запрос
SELECT * FROM 'tbl_user' WHERE "id" IN ('1','admin', 'user')
А если массив окажется пуст, то фреймворк гарантирует, что из таблицы не будет выбрана ни одна запись.
$dataProvider->criteria->addInCondition('id', array());
SELECT * FROM 'tbl_user' WHERE 0=1

Leave a Comment

Fields with * are required.

Please enter the letters as they are shown in the image above.
Letters are not case-sensitive.