0

コントローラー A で、このコントローラーに関連付けられていないモデルを読み込みます。コントローラー B のモデル名を 1 つの変数で管理することに関心があるため、テーブル/モデル B の名前が変更された場合に手動で多くの行を変更する必要はありません。

たとえば、以下はコントローラー A のコードです。

public $modelBName = 'ModelB';

public function controller_a_function() {
    $this->loadModel($this->modelBName);    // I use the variable here for model B

    $this->ModelB->model_b_function();    // COMMENT #1
}

質問: 「COMMENT #1」とコメントされた行について、「ModelB」という単語を明示的に書き出す代わりに変数名を使用するにはどうすればよいですか? $modelBNameこの行はコード全体で複数回表示されます。可能であれば変数を使用したいと思います。ModelBおそらく変更されませんが、何らかの理由で変更される場合は、複数の行を編集するのではなく、1 つの変数を変更するだけでよいでしょう。

4

2 に答える 2

2

簡単な答えです。これを使って:

$this->{$this->modelBName}->find('all');

プロパティ名が中括弧 {} で囲まれていることに注意してください。詳細については、マニュアルを参照してください。

http://php.net/manual/en/language.variables.variable.php

よりクリーンなアプローチは、一種の「ファクトリー」メソッドかもしれません。

/**
 * Load and return a model
 *
 * @var string $modelName
 *
 * @return Model
 * @throws MissingModelException if the model class cannot be found.
 */
protected function model($modelName)
{
    if (!isset($this->{$modelName})) {
        $this->loadModel($modelName);
    }

    return $this->{$modelName};
}

このように使用できます。

$result = $this->model($this->modelBName)->find('all');
debug($result);

また、モデルを指定したくないが、'$this->modelBName' を自動的に返すようにしたい場合。

/**
 * Load and return the model as specified in the 'modelBName' property
 *
 * @return Model
 * @throws MissingModelException if the model class cannot be found.
 */
protected function modelB()
{
    if (!isset($this->{$this->modelBName})) {
        $this->loadModel($this->modelBName);
    }

    return $this->{$this->modelBName};
}

次のように使用できます。

$result = $this->modelB()->find('all');
debug($result);
于 2013-02-08T20:45:03.230 に答える
1

モデル名とテーブル名を混同していると思います。$useTableプロパティを使用して、別のデータベース テーブルを使用するようにモデルを設定できます。次に例を示します。

class User extends AppModel {

    public $useTable = 'users_table'; // Database table used

}

class Product extends AppModel {

    public function foo() {
         $this->loadModel('User');

         $this->User->find('all');
    }
}

モデルの名前を変更する必要はありません。データベース テーブルの名前が変更された場合は$useTable、モデル内のプロパティを更新するだけです。

于 2013-02-08T17:19:36.067 に答える