Динамические имена таблиц в 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; } 

Но тем самым приводит к ошибке Using $this when not in object context поскольку function tableName() является static функцией.

Как я могу это сделать? Любая помощь оценивается. Спасибо заранее!

Изменить: подробное изображение

Скажем, у меня есть пользователь из компании ABC. У меня так много процессов в моем приложении, скажем, PQR является одним из них. Если пользователь из компании ABC входит в систему и выбирает процесс PQR, мне нужно создать таблицу ABC_PQR в моей базе данных, если она не существует или загрузить таблицу, если она уже создана. Мне нужно имя этой таблицы в моей модели. Точно так же могут быть пользователи и многие процессы. Каким будет наилучший подход к управлению базой данных.

Solutions Collecting From Web of "Динамические имена таблиц в Yii2"

Поскольку 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 не будет установлена. Таким образом, у вас есть разные варианты.

  1. Вручную вызовите конструктор перед использованием статических методов манипуляций с db.
  2. Добавьте статическую сеттеру в модель, такую ​​как 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();