【问题标题】:Find() with Deep Associations using Containable, Model associationsFind() 使用可包含的深度关联,模型关联
【发布时间】:2012-05-22 15:21:33
【问题描述】:

我正在尝试构建一个显示用户备忘录表格的视图。备忘录有一个类型 (memo_type) 和几个作者——作者表由记录组成:id, memo_id, user_id, precedence,而 MemoType 是 id, memo_type_desc。 (备忘录也有一个所有者(Memo.user_id),但这是一个简单的查询,我有一个可以正常工作的单独表)

这个想法是,当我查看有关用户的详细信息时,我会显示一个表格,其中包含该用户被列为作者的所有备忘录,并包括备忘录类型(信件、演示文稿等)

因此,尽管我可以从 read() 中获取我需要的数组,其中 recursive=3(请参阅下面的更多内容),但这很慢并且会检索大量数据,所以我正在尝试使用包含。 (我可以省略 memo_type_desc 但最终用户需要它。)

好的,所以我将public $actsAs = array('Containable'); 放入app_model.php

这里要注意的一件大事是,无论 MemoTypes 的附加关联级别如何,我都会返回相同的数组——当我添加 => array('MemoTypes.memo_type_desc') 时,我看不到数组中的附加级别。有了这第三级关联,我也会得到一个错误:

警告 (512):模型“Memo”与模型“MemoTypes”没有关联 [CORE/cake/libs/model/behaviors/containable.php,第 343 行

模型关联如下,这里是user_controller中的View函数。知道我的 Memo/MemoTypes 关联或 find() 语法有什么问题吗?

编辑:哦,我是一个蛋糕新手,我继承了这个应用程序。 PS,表格是由view.ctp中的foreach构建的,但是分页肯定会更好,但不知道从哪里开始。 =O

// Trying to get Containable method to work...
$this->set('userstuff', $this->User->find('all', array(
    'conditions' => array('User.id' => $id),
    'contain' => array(
        'Author.user_id',
        'Author.precedence',
        'Author.memo_id' => array(
            'Memo.memo_type_id' => array(
                'MemoTypes.memo_type_id' // <--problem here?
            )
        )
    )
)));

结果:

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1026
                    [group_id] => 2
                    [name] => John Doe
                    [username] => jd20001
                    [grpnum] => 99
                    [created] => 2010-03-22 15:08:35
                    [modified] => 2012-04-05 13:31:15
                )

            [Author] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 1026
                            [precedence] => 0
                            [memo_id] => 2579
                            [Memo] => Array
                                (
                                    [memo_type_id] => 1
                                )

                        )

                    [1] => Array
                        (
                            [user_id] => 1026
                            [precedence] => 0
                            [memo_id] => 2583
                            [Memo] => Array
                                (
                                    [memo_type_id] => 1
                                )

                        )

                    [2] => Array...

更多:

// Works, but retrieves entire users/memos tables so large memory footprint
$this->User->recursive = 3;
$this->set('user', $this->User->read(null, $id));

用户.php:

var $belongsTo = array(
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id'
    )
);
var $hasMany = array(
    'Author' => array(
        'className' => 'Author',
        'foreignKey' => 'user_id',
        'dependent' => true
    ),
    'Memo' => array(
        'className' => 'Memo',
        'foreignKey' => 'user_id',
        'dependent' => false
    )
);

备忘录.php:

var $hasMany = array(
    'Author' => array(
        'className' => 'Author',
        'foreignKey' => 'memo_id',
        'dependent' => true,
        'order' => 'precedence'
    )
);
var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'MemoType' => array(
        'className' => 'MemoType',
        'foreignKey' => 'memo_type_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Memo_type.php:

var $hasMany = array(
    'Memo' => array(
        'className' => 'Memo',
        'foreignKey' => 'memo_type_id',
        'dependent' => false
    )
);

【问题讨论】:

    标签: cakephp-1.3


    【解决方案1】:

    嗯,读了很多书,我终于“明白了”(在发布我的问题后仅仅一个小时的努力......这很有趣)。

    用户和组给我我的主要信息,然后备忘录让我建立一个“拥有”文档的表格,作者给我关于用户被列为作者的所有文档的数据!哇,在使用 CakePHP 一年之后,我现在才真正欣赏它 :)

    $this->set('user', $this->User->find('first', array(
        'conditions' => array('User.id' => $id),
        'contain' => array(
            'Group',
            'Memo',
            'Author' => array(
                'Memo' => array(
                    'MemoType' => array(
                        'fields' => array('memo_type_desc')
                    )
                )
            )
        )
    )));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2013-11-23
      • 2012-01-05
      相关资源
      最近更新 更多