我有一个Yii2模型,它使用多个具有相同结构的表.表名将根据登录的用户而变化,表名非常独特,取决于用户名.如何动态地将此表名分配给模型?到目前为止我已经这样做了.
在我的模型中:
protected $table;
public function __construct($table)
{
$this->table='custom_risk_assignment_table';//logic to obtain the table name goes here
}
public static function tableName()
{
return $this->table;
}
但是这样做会导致错误在不在对象上下文中时使用$this,因为函数tableName()是一个静态函数.
我怎么能这样做?任何帮助表示赞赏.谢谢!
编辑:详细的图片
假设我有ABC公司的用户.我的应用程序中有很多进程,比如PQR就是其中之一.如果ABC公司的用户登录并选择进程PQR,我需要在我的数据库中创建一个表ABC_PQR(如果不存在),或者如果已经创建了表,则加载该表.我需要将这个表名放入我的模型中.同样可能有用户和许多进程.管理数据库的最佳方法是什么.
解决方法:
由于tableName是一个静态方法(正是错误消息所说的),因此您无权访问非静态属性. (你不能使用$this关键字)
protected static $table;
public function __construct($table)
{
self::$table = $table;
}
public static function tableName()
{
return self::$table;
}
/* UPDATE */
public static function setTableName($table)
{
self::$table = $table;
}
更新:
好吧,我的错.如果你调用一个像updateall,find等静态方法,那么构造函数就不会被调用.$table也不会被设置.所以你有不同的选择.
>在使用静态db操作方法之前手动调用构造函数.
>将静态setter添加到模型中,如公共静态函数setTableName($tableName),并在每次成功登录时调用它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。