2013-05-02 41 views
0

我有一個附表,其中有許多活動。每個活動都屬於一個房間。包含的記錄只有afterFind的1級深度?

設置我的選擇的Contain'd找到::

$options = array(
      'conditions' => array('Schedule.' . $this->Schedule->primaryKey => $id), 
      'contain' => array(
       'Event' => array(
        'Room' 
      // Etc. 

我使用應有盡有:

$sched = $this->Schedule->find('first', $options); 

我對事件的模型中定義的一個afterFind方法;在我複印室的名稱到事件的顯示名稱,這樣的事件可以清楚地識別它在哪個房間

的問題:在一個afterFind方法事件沒有輔助記錄。具體來說,它沒有房間記錄。如果我做一個正常/非包含的查找(將$ this-> Schedule->遞歸域設置爲3),那麼我會看到房間的數據。

有沒有一種方法讓Contain在調用afterFind方法之前獲取相關記錄的數據?

回答

1

恕我直言,我猜你想複製房間名稱到事件的顯示名稱的原因是爲視圖?

我可以提出一個解決此問題的替代方法嗎?

我認爲創建一個視圖幫助器來協助渲染事件及其相關的房間信息會簡單得多。它沒有過於複雜,例如:

您認爲:

echo $this->Event->displayName($eventRecord) 

鑑於有關的containable行爲文檔的深度,它是純粹的黑魔法它是如何工作的我個人不希望修改任何代碼來執行你的建議。我完全讚賞你試圖達到的目標,但堅持KISS的原則,這似乎是正確的建議。

0

在許多情況下,Containable行爲會將find()查詢拆分爲單獨的查詢,並在稍後使用PHP合併結果。

要強制執行單個查詢,您可以嘗試使用joins替代。但是,由於hasMany,只使用連接可能不是最有效的查詢。

連接示例;

$options = array(
     'conditions' => array('Schedule.' . $this->Schedule->primaryKey => $id), 
     'contain' => array(
      'Event' => array(
       'joins' => array(
        array(
         'table' => 'rooms', 
         'alias' => 'Room', 
         'type' => 'INNER', 
         'conditions' => array(
          'Room.id = Event.room_id', 
         ) 
        ) 
       ) 
      ) 
     ); 

知道CakePHP的接受加入被定義一個包含。關於手動指定連接的更多信息可以在這裏找到:Joining Tables

相關問題