Динамические названия таблиц в Yii2

1 способ: через свойства

protected static $tableName;

public static function tableName()
{
    return self::$tableName;
}

public static function setTableName($tableName)
{
    self::$tableName = $tableName;
}

Одним из главных недостатков данного способа является то, что при каждом обращении к вашей модели, придется вызывать метод setTableName:

Articles::setTableName('articles');
$articles = Articles::find()->all();

2 способ: наследование

Создаем класс Entity:

class Entity extends ActiveRecord
{


  public static function tableName()
  {
      return '';
  }

  // тут определяем rules, attributeLabels и др.

}

Создаем классы ArticlesOne, ArticlesTwo и наследуемся от Entity и от каждого класса Articles* будем возвращать статичный метод tableName:

class ArticlesOne extends Entity
{
    public static function tableName()
    {
        return 'articles_one';
    }

    ...

}

class ArticlesTwo extends Entity
{
    public static function tableName()
    {
        return 'articles_two';
    }

    ...

}

Далее в зависимости от условий вызываем либо ArticlesOne, либо ArticlesTwo. Также можно оформить хелпер, который возвращает название класса для дальнейшей работы.

3 способ: фабричный метод

Более лаконичный способ - это использование паттерна "фабричный метод":

class Articles extends ActiveRecord 
{

    protected static $tableName;

    public static function useTable($tableName) {
        static::$tableName = $tableName;

        return new static();
    }

    public static function tableName() {
        return static::$tableName;
    }
}

Тогда, запросы к БД будут выглядеть следующим образом:

$article = Articles::useTable('articles');
$articles = $article::find()->all();

или

$articles = Articles::useTable('articles')::find()->all();
{{ message }}

{{ 'Comments are closed.' | trans }}