2011-05-31 46 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