CakePHP - 如何检索深层关联数据?

时间:2012-03-23 12:34:04

标签: cakephp

我有以下型号:

用户:

  • hasOne Profile,Page
  • hasMany Comment

注释:

  • belongsTo User,Page,Profile

网页:

  • belongsTo User
  • hasMany Comment

配置文件:

  • belongsTo User

当我检索一个页面时,我希望得到相关的评论,并且对于每个评论我想要个人资料。

我的评论表包含字段page_id和user_id。 我的个人资料表有user_id。

所以,我认为我需要做一些像

这样的事情
Comment belongsTo 
'Profile' => array(
        'conditions' => array('Profile.user_id' => 'Comment.user_id')
    )

但这不起作用 - 它返回一个空白的个人资料记录。

有人可以帮忙吗?我绕圈子走了! (使用CakePHP 2.0)

2 个答案:

答案 0 :(得分:2)

使用CakePHP的Containable behavior [link]。基本上,这允许您选择要包含在查找中的相关模型。

您还可以指定每个模型中需要的字段,在每个模型上指定条件......等等。

看起来应该是这样的:

//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',
                ),
            ),
        )
    ));

}

答案 1 :(得分: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)));
}

修改

Sharon,根据您的问题,评论似乎与用户和个人资料相关联。但是,如果Profile表示“用户配置文件”,则Comment和User之间的链接就足够了,然后包含:

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