Используем префиксы для таблиц
Рубрика: Мелкие заметки на тему Yii
18 Ноя. 2009Очень часто мне приходится заставлять работать проекты с практически идентичной структурой базы данных. Когда хостинг накладывает на меня ограничение что всё это должно быть в одной БД — возникает много проблем. В принципе есть только два варианта: использовать префиксы для таблиц и научить фреймворк с ними работать, либо постоянно править файлы модели и менять имена таблиц в ручную.
---Простым переопределением одного метода я добился удобной работы с префиксами. Теперь мне не требуется для каждого проекта, в каждой модели подставлять в ручную префикс.
Если мы используем в проекте модели типа ActiveRecord, мы соответственно наследуем свой класс от CActiveRecord:
class MyModel extends CActiveRecord { … }
В моем случае мы создадим главный класс для всех моделей MyActiveRecord (с наследованием от CActiveRecord), а все наши модели — будем наследовать именно от него.
В самом классе MyActiveRecord мы переопределим метод tableName который позволит нам использовать префиксы. Смотрим:
class MyActiveRecord extends CActiveRecord
{
public $prefix = 'tablePrefix_';
public function tableName()
{
return $this->prefix . parent::tableName();
}
}
Вот в принципе и все. Теперь все модели которые вы будите наследовать от MyActiveRecord — будут иметь префикс «tablePrefix_». Это означает что если в tableName у вас указанно «Users», то обращение будет происходить к таблице «tablePrefix_Users».
Вот как-то так :)
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Урок 6 : Регистрация и авторизация. Часть 1"
- Была у меня мысль когда то запустить свой блог на одном интересном бесплатном хостинге. Посмотрев на конфигурацию сервера и ... "Настройка Yii на хостинге без поддержки PDO"
- ... "Всех с 2012-м"

[adm] zolter
Было сказано: Среда, 18 Ноябрь 2009
Очень простая статья. Просто давно уже так делаю и решил дать рецепт тем кто еще не решился на такой шаг :)

[guest] hyzhak
Было сказано: Четверг, 19 Ноябрь 2009
В Yii 1.1 работа с префиксами уже учтена. для єтого в конфиге в компоненте db пишем:
tablePrefix => 'prefix_',
а в модели
public function tableName()
{
return '{{tablename_without_prefix}}';
}
http://www.yiiframework.com/doc/guide/database.dao#using-table-prefix

[adm] zolter
Было сказано: Четверг, 19 Ноябрь 2009
Ага, спасибо :)
Я именно про 1.0.10 и ниже говорил :)

[guest] RSol
Было сказано: Четверг, 19 Ноябрь 2009
А я делаю в конфиге параметр префикс, а потом делаю:
public function tableName(){
return Yii::app()->params['prefix].parent::tableName();
}

[guest] Гость
Было сказано: Пятница, 18 Декабрь 2009
Создал в папке protected\components файл MyActiveRecord.
В нем:
class MyActiveRecord extends CActiveRecord
{
public function tableName(){
return Yii::app()->params['tablePrefix'].parent::tableName();
}
}в config/mian.php
'params'=>array(
'tablePrefix'=>'tbl_',
)В модели:
class Page extends MyActiveRecord{...}
Не работает, ошибок не выдает, но и префикс не подставлен.
С Yii начал работать пару дней назад..

[guest] zolter
Было сказано: Суббота, 19 Декабрь 2009
Попробуйте сделать именно как в описанной статье выше, без описания префикса через конфиг.
А так в принципе в tableName вы можете сделать die(Yii::app()->params['tablePrefix']) и посмотреть видна ли ваша переменная префикса из конфига, в виджите

[guest] Гость
Было сказано: Суббота, 19 Декабрь 2009
Нет, не выводит)
За наводку спасибо, буду копать.


