12六/094
Yii Framework: 为 ActiveReord 添加表前缀
Yii framework 默认情况下并没有为数据表设置 prefix 的功能。 根据作者 qiang 的说话是这个功能并不是必须的,需要的用户可以自己建立扩展。确实是这样,在 Yii framework 完全 OO 的结构下,我们可以很方便的来实现表前缀扩展功能。接下来让我们看看如何来实现:
首先在我们的配置文件中 /wwwroot/protected/config/main.php 中添加下面的代码:
<?php return array( "params" => array( "dbPrefix" => "e_", ), ); ?>
这串代码中,我们定义了一个表前缀的名为 dbPrefix 的参数。
接着就要添加我们 CActiveRecord 的继承类了,以下的代码中我们建立了一个 MyActiveRecord 的继承类, 可以把它存放在 /wwwroot/protected/extensions/ 目录中:
<?php class EActiveRecord extends MyActiveRecord { public $prefix; public function __construct($attributes = array(), $scenario = "") { parent::__construct($attributes, $scenario); $this->prefix = Yii::app()->params->dbPrefix; } public function tableName() { // return table name with prefix return $this->prefix . get_class($this); } } ?>
在我们以后的项目中我们的 Model 都用 MyActiveRecord 代替原来的 CActiveRecord 就可以使用表前缀了。
如果我们需要使用 RBAC 功能,我们还可以继承 CDbAuthManager:
<?php class MyDbAuthManager extends CDbAuthManager { public function init() { $prefix = Yii::app()->params->dbPrefix; $this->itemTable = $prefix . $this->itemTable; $this->itemChildTable = $prefix . $this->itemChildTable; $this->assignmentTable = $prefix . $this->assignmentTable; parent::init(); } } ?>
关联文章:
2009年06月18日 10:56
您好,非常感谢您的文章,受益非浅。
能再详细介绍下结合角色控制在Yii下的用法吗?
比如需要建什么结构的表来配合?
在不同actions module 里该如何使用它?
谢谢!
2009年06月18日 12:07
rbac所要用到的几个数据表在官方的文档里有详细的介绍,你可以去官方网站看下指南,有中文版翻译的。在框架中也有个sql文件在帮住你自动建立这些数据表。 rbac在module里的用法是相同的。
2009年07月20日 10:46
我有点搞糊涂了,
blog中先前是
class EActiveRecord extends MyActiveRecord
而之后是 Model 都用 MyActiveRecord 代替原来的 CActiveRecord 就可以使用表前缀了。
MyActiveRecord定义在哪里?
还有即使这样, 如果表已经存在的情况下, 并且有表前缀, 如果我用命令行来生成脚手架, 貌似也不方便? 代码生成后手动去调整? 但那个时候生成的类已经是具有表前缀的类了, 请问楼主有什么好办法解决? 谢谢!
2009年07月20日 14:34
你可以在protected目录下添加extensions目录,然后用import在config文件中导入这个目录,这样你在这个目录下的扩展都会被自动读取。 由于这个是扩展功能,脚手架只能一些基本功能,不可能什么都依赖脚手架。 如果楼上有兴趣,可以重新写一个支持表扩展的脚手架。