2011-05-31 98 views
2

我有以下代碼,我在其中找到一個標籤。我想包含所有與未被「刪除」的標籤相關的帖子。然後我想找到這些帖子所屬的所有標籤。CakePHP Containable Model Not Retrieved

作爲一個測試,我已經附加了兩個模型來發布在第三級遞歸,標籤和用戶,通過包含。可容納行爲將檢索與Post相關聯的用戶模型,但不會顯示與帖子關聯的Tag模型。任何想法,如果CakePHP允許這種類型的遞歸(基於原始模型)?

我試過了包含和沒有標籤條件,所以我知道這不是問題。如果這是問題,那麼我應該得到一個空的Tag數組,但沒有什麼。

$tag = $this->Tag->find(
    'first', 
    array(
     'conditions' => $conditions, 
     'contain' => array(
      'Post' => array(
       'conditions' => array(
        'Post.deleted' => 0 
       ), 
       'limit' => 25, 
       'User', 
       'Tag' => array(
        'conditions' => array(
         'Tag.deleted' => 0 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

我知道有解決這個辦法,但我在爲什麼中容納的行爲做到這一點特別感興趣。我相信,在這個問題上獲得帖子的所有標籤,而不是循環發佈結果和重新查詢標籤會更有效。我希望有人會對這個問題有所瞭解,但我今天將深入研究CakePHP Containable行爲代碼,以查看它是否適用於框架或可能的錯誤。

回答

3

這不是一個真正的問題答案(這更多的是爲什麼會發生),但我認爲這就是它發生的原因以及如何避開它。我深入到Containable類中,並且查詢是使用完整的我的Tag模型構建的,這導致我相信Model類中的查詢和關聯可能會將其刪除,因爲Tag不明確。標籤會出現在Post記錄的左側和右側,因此可能會被刪除以防止遞歸循環。我懶得去挖掘模型類來得到真正的答案。

爲了解決這個問題,我綁定了一個模型別名來即時發佈,名爲PT。我添加了包含代碼的別名,瞧,我的標籤在那裏!

$this->Tag->Post->bindModel(
      array(
       'hasAndBelongsToMany' => array(
        'PT' => array(
         'className' => 'Tag' 
        ) 
       ) 
      ) 
     ); 

而且包含代碼...

$tag = $this->Tag->find(
      'first', 
      array(
       'conditions' => $conditions, 
       'contain' => array(
        'Post' => array(
         'conditions' => array(
          'Post.deleted' => 0 
         ), 
         'User', 
         'PT' => array(
          'conditions' => array(
           'PT.deleted' => 0 
          ) 
         ) 
        ) 
       ) 
      ) 
     ); 
+0

這似乎是,所以我打標問題的問題的原因作爲回答。 – 2011-06-02 22:02:29

+0

我犯了不使用別名和使用模型名稱的錯誤。謝謝! – Josh 2013-01-06 21:45:22