Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[Yii][Firebird] Вызов хранимой процедуры при сохранении модели

1
06 сентября 2012 года
kot_
7.3K / / 20.01.2000
Есть некая модель данных, которая унаследована от CActiveRecord, и в ней переопределяется метод insert следующим образом:

Код:
public function insert($attributes=null)
    {
        if(!$this->getIsNewRecord())
            throw new CDbException(Yii::t('yii','The active record cannot be inserted to database because it is not new.'));
        if($this->beforeSave())
        {
                   // $sql = 'select result from USER_modify (?,?,?);';
                    $sql = 'INSERT INTO users ( user_id,user_name, sort_order, is_active) VALUES (?,?,?,?)';
                    $sql_gen = 'SELECT gen_id(gen_users_id,1) from users';
                    $command = Yii::app()->db->createCommand($sql);
                    $gen = Yii::app()->db->createCommand($sql_gen);
                    $command->prepare();
                    $this->user_id = $gen->queryScalar();
                    $command->bindValue(1, $this->user_id);
                    $command->bindValue(2, $this->user_name);
                    $command->bindValue(3, 1);
                    $command->bindValue(4, 1);
   
                    $command->execute();
            $this->_pk=$this->user_id;
            $this->afterSave();
            $this->setIsNewRecord(false);
            $this->setScenario('update');
            return true;
        }
       
        return false;
    }
код вполне работает, но мне необходимо обращаться не к таблице, а вызывать хранимую процедуру (заккоментированный сиквел-код) - вот здесь возникает проблема. Так как соединение создается с параметром auto_commit = true при вызове $command->query(); вызов происходит - но не происходит почему то коммит транзакции.
Как решить?
1
10 сентября 2012 года
kot_
7.3K / / 20.01.2000
Вобщем решение проблемы - обновить PHP - библиотека PDO в версии 5.2.9 (это последняя откомпилированная версия под Windows, именно с ней проблемы) для Firebird содержит ряд багов (ссылки на багтреки давать не буду, ибо лень) - обновление до 5.3 и выше (либо самостоятельная сборка из сырцов для 5.2 - вероятно, сам не пробовал) проблему решает. Я использовал библиотеки входящие в состав XAMPP для соотвествующей версии PHP.
Как это работает:
В контроллере:

Код:
public function actionJCreate()
{
                $model=new User;

         
        if(isset($_POST['User']))
        {
//Если не установлено автоматическое завершение транзакций
                    $trans = new CDbTransaction(Yii::app()->db);
            $model->attributes=$_POST['User'];
                        $model->sort_order = 1;
                        $model->is_active = 1;
                        $model->user_id = -1;
            if($model->save()){
                             $trans->commit(); //Коммитим
                            $this->redirect('/users/user/');
                             
                        }  
}
В модели переопределяем метод insert

Код:
public function insert($attributes=null)
{
        if(!$this->getIsNewRecord())
            throw new CDbException(Yii::t('yii','The active record cannot be inserted to database because it is not new.'));
        if($this->beforeSave())
        {
                    $sql = 'select result from user_modify (?,?,?);';
         
                    $command = Yii::app()->db->createCommand($sql);
         
                    $command->prepare();
         
                    $command->bindValue(1, $this->user_id);
                    $command->bindValue(2, $this->user_name);
                    $command->bindValue(3, 'new');
                   
         
                    $row = $command->queryRow();
                    $command->reset();
                        $this->user_id = $row['result'];
                    $this->_pk=$this->user_id;
            $this->afterSave();
            $this->setIsNewRecord(false);
            $this->setScenario('update');
                return true;
        }
       
        return false;
}
и все благополучно работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог