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)
这绝对可以解决问题.
| 归档时间: |
|
| 查看次数: |
9669 次 |
| 最近记录: |