Yii模型:在Yii模型中使用动态表名

Arf*_*een 1 php yii yii-cmodel

我有一个Yii模型将使用(稍后)多个数据库,表前缀将基于代码.

例如:

AMI_tablename,BMI_ AMI_tablename等

这些所有表都相同但在不同的数据库中.

我想知道如何在运行时向Yii模型提供动态表名?

我尝试使用setter函数,但父类CActiveRecord给出了一个错误,因为它没有从子模型类中获取值.

所以这是我的模型代码(只有我有问题的部分)

class RevShareModel extends CActiveRecord
{

    public $prefix;

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return $this->prefix . '_revshare_model';
    }
Run Code Online (Sandbox Code Playgroud)

现在在我的控制器的某个地方

$obj = RevShareModel::model();
$obj->prefix ="BMI";
$obj->tableName();
$obj->findByPk(1);

exit;
Run Code Online (Sandbox Code Playgroud)

但我得到的错误是:

CDbException

The table "_revshare_model" for active record class "RevShareModel" cannot be found in the database.

C:\wamp\www\framework\db\ar\CActiveRecord.php(2264)
Run Code Online (Sandbox Code Playgroud)

好像当CActiveRecord调用tableName()方法时,它不会获得$前缀.

小智 5

您有这样的错误,因为表名实际上存储在模型的元数据中.您可以通过检查$model->getMetaData()返回CActiveRecordMetaData对象的内容来查看.要刷新元数据,您应该$model->refreshMetaData()在更改模型的"prefix"属性后调用,例如:

...
$obj->prefix ="BMI";
$obj->refreshMetadata();
...
Run Code Online (Sandbox Code Playgroud)

这绝对可以解决问题.