У меня есть модель 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();