2013-02-08 56 views
0

在控制器A中,我加載了一個與此控制器無關的模型。我有興趣使用單個變量來管理控制器B的型號名稱,所以如果表格/型號B的名稱發生更改,我不必手動更改許多行。CakePHP:用一個變量管理控制器中的表名稱

例如下面是控制器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 
} 

問題: 對於行註釋「註釋#1,」我怎麼使用變量名稱,而不是明確地寫出來的字「ModelB」的?該行在整個代碼中出現多次,如果可能,我想使用變量$modelBNameModelB可能不會改變,但如果它由於某種原因而改變,那麼更改一個變量而不是編輯多行是很好的。

回答

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); 

而且,如果你不想指定模型,但希望它返回一個「$這個 - > 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); 
+0

嘿,大括號工作。不過,我想知道,如果這是一個很好且常見的做法?我還沒有看到任何其他人的代碼這樣做。他們總是在需要使用模型的地方執行'$ this-> ModelName-> someFunction'。任何想法? – musicliftsme 2013-02-11 17:48:51

+0

如果您使用常規'$ uses'數組,則該模型將被加載,您不必手動加載模型。我真的沒有看到使用模型名稱的優勢。海事組織甚至會讓它不太「顯而易見」你正在研究的模型。例如。調用$ this-> User-> save()比$ this - > {$ this-> modelName} - > save()清晰得多。 – thaJeztah 2013-02-11 20:00:37

+0

我現在只是在控制器動作中使用'loadModel('model_name')',而不是使用'$ uses'數組,因爲不是每個動作都需要控制器中使用的整個模型集。我想我會隨着這一個的可讀性去採取你的建議。 – musicliftsme 2013-02-11 21:16:04

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屬性即可。

+0

嘿,感謝您的答覆。我發現我確實弄錯了這些條款,但我已經修復了我的帖子。我基本上希望爲模型B的名稱'ModelB'使用一個變量,而不是將它寫在COMMENT#1行中。 – musicliftsme 2013-02-08 18:25:48

相關問題