0

在控制器 A 中,我加载了一个与此控制器无关的模型。我有兴趣使用单个变量管理控制器 B 的模型名称,因此如果表/模型 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”?此行在整个代码中出现多次,如果可能,我想使用该变量$modelBNameModelB可能不会改变,但如果出于某种原因改变了,最好只改变一个变量而不是编辑多行。

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 回答