2012-11-19 95 views
0

這可能很容易做到,但我現在似乎無法解決這個問題。比方說,在一個CakePHP的應用程序組件,我有一個變量my_model,其中包含當前正在使用像分量中的對應控制器的型號:根據cakephp查詢中的條件設置模型

function TestComponent extend Object 
{ 
    var $my_model; // can be either User, or Person 

    function test() 
    { 
     $myModelTemp = $this->my_model; 

     $model = $myModelTemp != 'User' ? $myModelTemp.'->User' : 'User'; 

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

正如你可以在我的功能test()見上我試圖做的是根據my_model的值調用正確的模型。因此,基於條件,我的查詢將是兩種:

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

或者

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

當我這樣做,像我上面那樣,我得到一個錯誤說Fatal error: Call to a member function find() on a non-object。換句話說,那個錯誤意味着Person->User不是一個對象(所以它被認爲是一個字符串)。

回答

0

你說的話可能是真的,但是,它可以指任何部分的調用。

所以無論是個人還是用戶都可能是無效的,或者它們一起導致錯誤。很難說。 嘗試使用var_dump()轉儲單個對象;

所以嘗試:

<?php 
    echo "<pre>"; 
    var_dump(is_object($this->Person)); 
    var_dump(is_object($this->User)); 
    echo "</pre>"; 
?> 

,以確定你的代碼出錯。 要清楚的是,返回值必須是真實的,因爲它是一個對象。

返回錯誤的是可能的罪魁禍首。

如果您的問題引用了引用對象的正確方式,則對象基本上是一個數組。例如:

<?php 
    $obj = (object) array("this", "my_function"); 
?> 

上面的示例將數組轉換爲對象。但是,使用多個圖層可能會比您期望的要困難得多。

0

一般來說,它看起來像你可能會這樣做都是錯誤的。顯然,你希望模型是動態的,但是你首先要對它的動態編碼進行硬編碼。

它也好像你可能會做這一切在組件違反的CakePHP和MVC的校長。我不確定這個組件應該真正在操縱模型還是假設當前正在使用哪些模型。但是,如果要將字符串評估爲實際對象,則可以將其包裝爲{ ... }(這是有效的標準PHP語法,而不是特定於Cake的代碼)。

試試這個:

$modelName = $this->my_model; 

$model = ($modelName != 'User') ? $this->{$modelName}->User : $this->User; 

$model->find('all'); 

現在,如果這不工作,或者你得到一個錯誤說,它不能找到模型(一個或多個),你需要確保模型的實際加載和初始化中當前的範圍。