2013-05-02 54 views
3

這裏是我的模型:CakePHP的:findById()與中容納未返回預期協會

class Question extends AppModel { 


public $hasMany = array(
    'CaseQuestions' => array('className'=>'Question', 'foreignKey'=>'parent_id') 
); 

public $hasOne = array(
    'CaseStudy' => array('className'=>'Question', 'foreignKey'=>'parent_id') 
); 

下面是我的控制器動作:

public function admin_delete_case_question($question_id) { 
     $this->Question->Behaviors->load('Containable'); 
     $this->Question->contain(array('CaseStudy')); 
     $question = $this->Question->findById($question_id); 
     debug($question); 
     exit; 

從上面的調試返回是這樣的:

array(
    'Question' => array(
     'id' => '78', 
     'nickname' => '', 
     'content' => 'sdgsdfgs', 
     'type' => 'CQ', 
     'option1' => 'sdfgsdfg', 
     'option2' => '', 
     'option3' => '', 
     'option4' => '', 
     'time' => '-1', 
     'difficulty' => '0.0000', 
     'slope' => '0.0000', 
     'chance' => '0', 
     'experiment' => false, 
     'created' => '2013-05-02 16:30:29', 
     'modified' => '2013-05-02 16:30:29', 
     'status' => null, 
     'perm_id' => '76', 
     'notes' => null, 
     'is_deleted' => false, 
     'answer_id' => '0', 
     'parent_id' => '77', 
     'order' => null 
    ), 
    'CaseStudy' => array(
     'id' => null, 
     'nickname' => null, 
     'content' => null, 
     'type' => null, 
     'option1' => null, 
     'option2' => null, 
     'option3' => null, 
     'option4' => null, 
     'time' => null, 
     'difficulty' => null, 
     'slope' => null, 
     'chance' => null, 
     'experiment' => null, 
     'created' => null, 
     'modified' => null, 
     'status' => null, 
     'perm_id' => null, 
     'notes' => null, 
     'is_deleted' => null, 
     'answer_id' => null, 
     'parent_id' => null, 
     'order' => null 
    ) 
) 

我不明白爲什麼CaseStudy數組都是NULL,因爲當我看着那條記錄(ID 77 )在數據庫中所有的數據都是正確的。我究竟做錯了什麼?

回答

3

在你的榜樣......問題hasOne案例研究;這意味着問題是父母。

根據你的數據,你的問題有一個parent_id,所以我假設你實際上是指CaseStudy是父母,Question是孩子。看起來你的關聯實際上是向後的(通常父母不會有parent_id)。

更換您的hasOne關聯,具有替代的belongsTo:

public $belongsTo = array(
     'CaseStudy' => array('className'=>'Question', 'foreignKey'=>'parent_id') 
); 

這將確保案例研究是父,而問題是孩子。

以目前設置的方式,CakePHP正在嘗試查找具有與您的Question.id相同的parent_id的CaseStudy;因爲在數據庫中沒有任何數據,所以CakePHP找不到任何數據並返回空值。 實際上,CaseStudy實際上是父母,問題的父母id等於CaseStudy.id

+0

這很有道理。我要馬上測試。不過,我想澄清一件事:CaseStudy課也是問題。換句話說,我擁有屬於同一個表/模型中記錄之間的關聯關係。也許這個問題很明顯,但我想確保它很清楚,以防需要特殊處理。 – emersonthis 2013-05-03 15:15:54

+0

是的,我明白 - 我昨晚爲自己做了一個自己的測試環境,以驗證它對你有用,在我的測試中它按預期工作。 – jrace 2013-05-03 15:31:18

+0

也適合我!謝謝!! – emersonthis 2013-05-03 17:16:58

2

試試這個:

//Question model 
public $actsAs = array('Containable'); //personally, I put this in my AppModel 

//QuestionsController 
$question = $this->Question->find('first', array(
    'conditions' => array(
     'id' => $question_id 
    ), 
    'contain' => array(
     'CaseStudy' 
    ) 
)); 
+1

我從書中得到了這個想法:http://book.cakephp.org/2.0/en/core-libraries/behaviors /containable.html它在第一段中說,你可以隨時加載行爲,就像我在這裏和其他許多地方所做的一樣。 – emersonthis 2013-05-02 21:01:57

+1

試圖確保你的方式和結果是相同的(CaseStudy所有空值) – emersonthis 2013-05-02 21:04:32