nepster-web
@nepster-web

SetAttributes в Yii, проблема с поиском?

Есть такая проблема, мне нужно осуществить поиск юзеров по определенным параметрам.
Нужно искать по тем параметрам, которые попали в $params.
Это может быть user_id и trusted, это может быть просто user_id и тп.

Итак, со строками проблем нет. А вот со статусами, особенно где есть поля по умолчанию возникает проблема.

Мой контроллер:
$UsersModel = new UsersModel;
        $UsersModel->scenario = 'control_search';
        $UsersModel->setAttributes($params);
        
        $criteria = new CDbCriteria;
        $criteria->limit     = ProcessingData::load()->limit();
        $criteria->order     = '1date_register DESC';
        $criteria->offset    = ProcessingData::load()->offset($params['page'],$criteria->limit);

        if($UsersModel->user_id)
            $criteria->compare('user_id',$UsersModel->user_id);
            
        if($UsersModel->trusted || (string)$UsersModel->trusted === '0')
            $criteria->compare('trusted',$UsersModel->trusted);
            
        if($UsersModel->active || (string)$UsersModel->active === '0')
            $criteria->compare('active',$UsersModel->active);
        
        $criteria->compare('login',$UsersModel->login, true);
        $criteria->compare('name',$UsersModel->name, true);
        $criteria->compare('mail',$UsersModel->mail, true);


Теперь в чем суть, к примеру я хочу показать всех пользователей у которых trusted = 1, тоесть должна выполниться только данная проверка

if($UsersModel->trusted || (string)$UsersModel->trusted === '0')
            $criteria->compare('trusted',$UsersModel->trusted);


Но выполняется постоянно все числовые проверки, так как у меня в базе прописаны дефолтные значения.

если я не передам к примеру параметр active и распечатаю атрибуты
print_r($UsersModel->getAttributes());
то этот active будет = дефолтному значению из таблицы (тоесть 0). А это все дело портит мой поиск.

Подскажите пожалуйста как можно исправить ситуацию, например отключить дефолтовые значения в атрибутах ?
  • Вопрос задан
  • 2937 просмотров
Пригласить эксперта
Ответы на вопрос 2
Первое, что приходит в голову
if(isset($params['UsersModel']['user_id']))
    $criteria->compare('user_id',$UsersModel->user_id);
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Я правильно понимаю - код, который вы привели, это отчасти то, что вам gii нагенерировал, да?
$criteria = new CDbCriteria;
$criteria->limit     = ProcessingData::load()->limit();
$criteria->order     = '1date_register DESC';
$criteria->offset    = ProcessingData::load()->offset($params['page'],$criteria->limit);
foreach($params as $attr => $value)
    $criteria->compare($attr, $value)

решит все ваши проблемы. Единственное, перед этим пройдитесь по $params и вручную приведите поля к нужным типам там, где это необходимо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы