php – Yii2中的动态表名

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...