【问题标题】:Retrieving recursive data with read function at CakePHP在 CakePHP 中使用读取函数检索递归数据
【发布时间】:2012-09-24 08:55:08
【问题描述】:

我有一个类似博客系统的东西。每个条目都可以有 cmets。每条评论都是由用户创建的。

我目前正在控制器上的“查看”操作中使用读取功能来检索所有数据。

模型之间的关系已经创建(belongTo、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  
                   )
            )
    )

谢谢。

【问题讨论】:

    标签: cakephp cakephp-2.0 cakephp-2.2


    【解决方案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  
                   )
            )
    
    )
    

    根据我的经验,Cake 查询深度关联的效率不是很高。在您的情况下,它将为每个Comment 生成一个查询以获取其User。我会通过让 Cake 只获取 cmets 来避免这种情况,然后提取 cmets 的用户 ID,在一个查询中获取所有具有这些 ID 的用户,然后将该用户信息添加到原始结果中。

    【讨论】:

    • CakePHP 2.2 中没有这样的参数“包含”用于查找方法:book.cakephp.org/2.0/en/models/retrieving-your-data.html#find
    • 您需要启用Containable 行为
    • @Steve 是的。 @ori 指出了最好的方法 - Containable 将结果集“包含”到您定义的模型/表集。它在技术上的作用是动态地重新定义模型绑定。这与您使用 $this->Model->bindModel()$this->Model->unbindModel() 相同 - 它实际上使用了这些。否则,是的,将 $this->Model->recursive 设置为高于 1 的值(唯一的其他选项是 2)很慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多