3

同じ構造を持つ複数のテーブルを使用する 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 はその 1 つです。会社ABCのユーザーがログインしてプロセスPQRを選択した場合、データベースにテーブルABC_PQRが存在しない場合は作成するか、テーブルが既に作成されている場合はロードする必要があります。モデルにこのテーブル名が必要です。同様に、多くのユーザーと多くのプロセスがそこにあります。データベースを管理するための最良のアプローチは何でしょうか。

4

3 に答える 3

1

ハッキングせずにこの状況から抜け出す 1 つの方法は、戻り値を変更せず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();
于 2014-05-09T09:36:13.820 に答える