我有一个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),并在每次成功登录时调用它.