AR не учитывает префикс таблицы

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Grigory
Сообщения: 47
Зарегистрирован: 2011.09.30, 04:30

AR не учитывает префикс таблицы

Сообщение Grigory »

В БД есть две таблицы prefix1_rooms и prefix2_rooms.
Пытаюсь запросить данные из таблицы prefix2_rooms:

Код: Выделить всё

Yii::app()->db->tablePrefix='prefix1_';
//$rcd=Rooms::model()->findByPk(1);
Yii::app()->db->tablePrefix='prefix2_';
$rcd=Rooms::model()->findByPk(11);
Код работает. Но если раскомментировать вторую строчку, т.е. сначала запросить данные из таблицы prefix1_rooms, а затем запросить данные из prefix2_rooms, то результаты всё равно возвращаются из таблицы prefix1_rooms. Моя ошибка? Работает какой-то кеш? Баг? Заранее благодарен.

Настройки БД в main.php следующие:

Код: Выделить всё

...
'db'=>array(
  'connectionString'=>'mysql:host=localhost;dbname=gb_db',
  'username'=>'username',
  'password'=>'password',
  'charset'=>'utf8',
  'tablePrefix'=>'sw_'
),
...
 
Код класса Rooms:

Код: Выделить всё

    class Rooms extends CActiveRecord{
        public static function model($className=__CLASS__){
            return parent::model($className);
        }
        
        public function tableName(){
            return '{{'.strtolower(get_class($this)).'}}';
        }
        
        public function beforeSave(){
            if ($this->isNewRecord)
                $this->prior=$this->maxPrior()+1;
            
            return true;
        }
        
        public function maxPrior(){
            return Yii::app()->db->createCommand()
                ->select('MAX(prior)')
                ->from($this->tableName())
                ->queryScalar();
        }
        
        public function relations(){
            return array(
                'periods'=>array(self::HAS_MANY, 'Periods', 'fk_room'),
                'trans'=>array(self::HAS_ONE, 'Periods', 'fk_room', 'scopes'=>'trans'),
                'before'=>array(self::HAS_ONE, 'Periods', 'fk_room', 'scopes'=>'before'),
                'after'=>array(self::HAS_ONE, 'Periods', 'fk_room', 'scopes'=>'after'),
                'inners'=>array(self::HAS_MANY, 'Periods', 'fk_room', 'scopes'=>'inners'),
                'type'=>array(self::BELONGS_TO, 'Types', 'fk_type'),
                'images'=>array(self::HAS_MANY, 'Images', 'fk_room', 'order'=>'images.prior ASC')
            );
        }
        
        public function rules(){
            return array(
                array('fk_type, prior', 'numerical', 'integerOnly'=>true),
                array('price', 'numerical'),
                array('name', 'length', 'max'=>50),
                array('is_off', 'boolean')
            );
        }
    }
 
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: AR не учитывает префикс таблицы

Сообщение SiZE »

Попробуй получить объект модели не через model, а через new и получить данные.

Код: Выделить всё

Yii::app()->db->tablePrefix='prefix1_';
$model1 = new Rooms;
$model1->findByPk(1);
Yii::app()->db->tablePrefix='prefix2_';
$model2 = new Rooms;
$model2->findByPk(1); 
Grigory
Сообщения: 47
Зарегистрирован: 2011.09.30, 04:30

Re: AR не учитывает префикс таблицы

Сообщение Grigory »

Попробовал этот вариант, не работает.
Зато, работает такой вариант:

Код: Выделить всё


Yii::app()->db->tablePrefix='prefix1_';
$rcd=Rooms::model()->findByPk(1);

Yii::app()->db->tablePrefix='prefix2_';
Rooms::model()->refreshMetaData();
$rcd=Rooms::model()->findByPk(11);

Но непонятно как применить метод refreshMetaData ко всем классам БД.
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: AR не учитывает префикс таблицы

Сообщение sluchainiyznak »

как вариант - переопределить CActiveRecord, в конструкторе делать refreshMetaData и остальные модельки отнаследовать от своего Класса
Grigory
Сообщения: 47
Зарегистрирован: 2011.09.30, 04:30

Re: AR не учитывает префикс таблицы

Сообщение Grigory »

Решил проблему так.
Создал метод setPrefix:

Код: Выделить всё

public function setPrefix($prefix){
            if ( !empty($prefix) ){
                Yii::app()->db->tablePrefix=$prefix;
                Yii::app()->db->schema->refresh();
            }
        }
 
Создал класс ActiveRecord:

Код: Выделить всё

class ActiveRecord extends CActiveRecord{
// для вызова статической функцией className::model()->find()        
public static function model($className=__CLASS__){
            $model=parent::model($className);
            $model->refreshMetaData();
            return $model;
        }
        
        //для вызова после создания объекта оператором new
        public function init(){
            $this->refreshMetaData();
        }
    }
 
Всем Спасибо за ответы.
Ответить