包含的记录只有1级深度的afterFind?

时间:2013-05-02 21:52:30

标签: cakephp cakephp-2.0

我有一个包含很多活动的时间表。每个活动属于一个房间。

我设置了包含“查找::

”的选项
    $options = array(
            'conditions' => array('Schedule.' . $this->Schedule->primaryKey => $id),
            'contain' => array(
                'Event' => array(
                    'Room'
            // Etc.

我发现一切都在使用:

$sched = $this->Schedule->find('first', $options);

我在Event&#39的模型上定义了一个afterFind方法;我将会议室的名称复制到活动的显示名称中,以便活动可以清楚地识别它所在的房间。

问题:在afterFind方法中,Event没有辅助记录。具体来说,它没有房间记录。如果我执行普通/非包含的查找(将$ this-> Schedule->递归字段设置为3),那么我会看到会议室的数据。

在调用afterFind方法之前,Contain是否有办法获取相关记录的数据?

2 个答案:

答案 0 :(得分:1)

恕我直言,我猜你要将房间名称复制到活动的显示名称是为了一个视图吗?

我可以建议另一种方法解决这个问题吗?

我认为创建视图助手来帮助渲染事件及其相关的房间信息会更加简单。它不必太复杂,例如:

在您的观点中:

echo $this->Event->displayName($eventRecord)

鉴于与containable行为有关的文档深度,它是纯粹的黑魔法它是如何工作的,我个人不希望修改它的任何代码来做你的建议。我完全理解你想要实现的目标,但坚持KISS的原则,这似乎是正确的建议。

答案 1 :(得分:0)

在许多情况下,Containable行为会将find()查询“拆分”为单独的查询,并在以后使用PHP合并结果。

要强制执行单个查询,您可以尝试使用joins。但是,由于hasMany,仅使用连接可能不是最有效的查询。

加入-示例;

$options = array(
        'conditions' => array('Schedule.' . $this->Schedule->primaryKey => $id),
        'contain' => array(
            'Event' => array(
                'joins' =>  array(
                    array(
                        'table' => 'rooms',
                        'alias' => 'Room',
                        'type' => 'INNER',
                        'conditions' => array(
                            'Room.id = Event.room_id',
                        )
                    )
                )
            )
        );

注意确定CakePHP是否接受连接定义内部 a Contain。有关手动指定联接的更多信息,请访问:Joining Tables