У меня есть модель 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; }   Но тем самым приводит к ошибке Using $this when not in object context поскольку function tableName() является static функцией. 
Как я могу это сделать? Любая помощь оценивается. Спасибо заранее!
Изменить: подробное изображение
Скажем, у меня есть пользователь из компании ABC. У меня так много процессов в моем приложении, скажем, PQR является одним из них. Если пользователь из компании ABC входит в систему и выбирает процесс PQR, мне нужно создать таблицу ABC_PQR в моей базе данных, если она не существует или загрузить таблицу, если она уже создана. Мне нужно имя этой таблицы в моей модели. Точно так же могут быть пользователи и многие процессы. Каким будет наилучший подход к управлению базой данных.
  Поскольку tableName – это статический метод (именно это сообщение об ошибке), у вас нет доступа к нестатическим свойствам.  (вы не можете использовать $this keyword) 
Поэтому вам придется объявить статическое свойство:
 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 статический метод, например updateAll , find и т. Д. И $table не будет установлена.  Таким образом, у вас есть разные варианты. 
public static function setTableName($tableName) и вызовите ее при каждом успешном входе в систему.   Один из способов выйти из этой ситуации без хаков – не изменять значение возвращаемого значения tableName а вместо этого использовать разные классы для разных таблиц.  Эти классы будут отличаться только реализацией tableName : 
 abstract class Foo extends ActiveRecord { // your existing code goes here abstract function tableName(); } class FooOne extends Foo { function tableName() { return 'table1'; } } class FooTwo extends Foo { function tableName() { return 'table2'; } } 
Затем в каком-то подходящем месте в вашем приложении вы решите, какую таблицу вы хотите использовать, и помните, что такое модель для этой таблицы. Что-то вроде:
 if ($username == "anne") { $fooModel = new FooOne(); } else if ($username == "bob") { $fooModel = new FooTwo(); } 
  После этого вы можете просто использовать $fooModel в качестве цели вызова, и запрос автоматически повлияет на соответствующую таблицу.  Например: 
 $foos = $fooModel::findAll();