2012-03-23 63 views
1

我有以下型號:CakePHP - 如何檢索深度關聯的數據?

用戶:

  • hasOne檔案,頁
  • 的hasMany評論

評論:

  • 屬於關聯用戶,頁,簡介

頁:

  • 屬於關聯用戶
  • 的hasMany評論

資料:

  • belongsTo用戶

當我檢索一個頁面時,我想要獲取關聯的註釋,並且對於每個註釋我都希望配置文件。

我的評論表有字段page_id和user_id。 我的個人資料表有user_id。

所以,我想我需要做的是這樣

Comment belongsTo 
'Profile' => array(
     'conditions' => array('Profile.user_id' => 'Comment.user_id') 
    ) 

但是這不工作 - 它返回一個空白的個人資料記錄。

任何人都可以幫忙嗎?我正在轉圈! (使用CakePHP 2.0)

回答

2

使用CakePHP的Containable behavior [link]。基本上,這使您可以選擇並選擇要在查找中包含哪些相關模型。

你也可以指定你從每個模型需要哪些字段(S),指定每個條件...等。

它應該是這個樣子:

//PageModel 

public $actsAs = array('Containable'); 

public function getPage($id=null) { 
    $this->recursive = -1; //often set to -1 in the AppModel to make -1 the default 
    $this->find('all', array(
     'conditions' => array(
      'Page.id' => $id 
     ), 
     'contain' => array(
      'Comment' => array(
       'User' => array(
        'Profile', 
       ), 
      ), 
     ) 
    )); 

} 
+0

隨着'contain'這樣設置,不會讓你提出的所有意見擁有頁面的用戶,甚至那些與所選頁面無關的用戶?不知道這是她想要的。 – nIcO 2012-03-23 13:45:57

+0

好點 - 編輯答案檢索所有評論,然後他們是關聯的用戶/配置文件。 – Dave 2012-03-23 13:57:53

+0

謝謝。將嘗試兩個答案。 – Sharon 2012-03-26 20:31:16

1

如果關係正常宣佈,所有你需要的數據可以通過搜索所需的頁面檢索。但爲了限制返回的數據量,您可能必須使用te ContainableBehavior。

PageModel:

var $actsAs = array('Containable'); 

PagesController:

function view($id) 
{ 
    $this->Page->contain(array('Comment' => array('User', 'Profile'))); 
    $page = $this->Page->find('first', array('conditions' => array('Page.id' => $id))); 
} 

編輯

沙龍,根據你的問題似乎評論鏈接到用戶和配置文件。但是,如果配置文件是指「用戶配置文件」,評論和用戶之間的聯繫就足夠了,然後將含有應該是:

$this->Page->contain(array('Comment' => array('User' => array('Profile')))); 
+0

配置文件不與頁面關聯,因此您不能以這種方式包含它。在模型中保留髮現是一種很好的做法,而不是控制器。 – Dave 2012-03-23 13:58:46

+0

好點... :-)我也編輯了我的答案。 – nIcO 2012-03-23 15:14:11