2012-09-24 27 views
0

我有类似博客系统的东西。每个条目都可以有评论。每条评论都是由用户创建的。在CakePHP中使用读取函数检索递归数据

我目前在控制器的'view'操作上使用read函数来检索所有的数据。

模型之间的关系已创建(belongsTo关系,的hasMany ...等)

当输入视图被调用时,我得到的是这样的:

['Entry'] => Array 
    (
     [id] => 1 
     [body] => 'xxxxxx' 
     [...] => ... 
    ) 

[Comment] => Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [user_id] => 1 
       [body] => This is an example of a comment guys! 
       [created] => 0000-00-00 00:00:00 
      ) 

     [1] => Array 
      (
       [id] => 2 
       [user_id] => 1 
       [body] => This is the 2nd comment!!! 
       [created] => 0000-00-00 00:00:00 
      ) 
    ) 

有什么办法,用读函数,以检索评论的“递归”数据,例如与user_id相关的用户数据? (为了得到他们的名字等)

我希望这样的事情:

['Entry'] => Array 
    (
     [id] => 1 
     [body] => xxxxxx 
     [...] => ... 
    ) 

[Comment] => Array 
    (
     [0] => Array 
      (
       [Comment] => Array 
        (
         [id] => 1 
         [user_id] => 1 
         [body] => This is an example of a comment guys! 
         [created] => 0000-00-00 00:00:00 
        ) 

       [User] => Array 
        (
         [id] => 1 
         [username] => myusername 
         [created] => 0000-00-00 00:00:00 
        ) 
      ) 

     [1] => Array 
      (
       [Comment] => Array 
        (
         [id] => 1 
         [user_id] => 2 
         [body] => fasdfasfaT 
         [created] => 0000-00-00 00:00:00 
        ) 

       [User] => Array 
        (
         [id] => 2 
         [username] => myusername2 
         [created] => 0000-00-00 00:00:00 
        ) 
      ) 
    ) 

感谢。

回答

1

是的。

您可以通过recursive属性控制关联的深度,或者使用containable行为来精确指定要包含哪些模型。我始终为AppModel.php$actsAs = array('Containable');)中的所有型号启用此行为。然后使用它是这样的:

$this->Entry->find('all', array(
    ... 
    'contain' => array('Comment' => 'User') 
)); 

结果将是这样的:

['Entry'] => Array 
(
    [id] => 1 
    [body] => xxxxxx 
    [...] => ... 
) 

[Comment] => Array 
(
    [0] => Array 
     (
      [id] => 1 
      [user_id] => 1 
      [body] => This is an example of a comment guys! 
      [created] => 0000-00-00 00:00:00 
      [User] => Array 
       (
        [id] => 1 
        [username] => myusername 
        [created] => 0000-00-00 00:00:00 
       ) 
     ) 

) 

以我的经验蛋糕是不是很有效查询很深的关联。在你的情况下,它会为每个Comment生成一个查询来获取其User。通过让Cake仅提取评论,然后摘取评论的用户ID,在一个查询中获取具有这些ID的所有用户,然后将该用户信息添加到原始结果中,我会避​​免它。

+0

CakePHP 2.2没有这样的参数“包含”find方法:http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find – Alvaro

+1

您需要启用[Containable ](http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html)行为 – ori

+1

@Steve是的。 @ori指出了最好的方法 - Containable是什么“包含”结果集给您定义的模型/表格集。它在技术上重新定义了模型绑定。这与使用'$ this-> Model-> bindModel()'或'$ this-> Model-> unbindModel()'相同 - 它实际上使用了这些。否则,是将'$ this-> Model->递归'设置为高于1(唯一的其他选项是2)的值较慢。 –