0

我有一个包含许多事件的时间表。每个事件都属于一个房间。

我为 Contain'd find:: 设置了我的选项

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

我发现一切都在使用:

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

我在事件模型上定义了一个 afterFind 方法;我将房间的名称复制到事件的显示名称中,以便事件可以清楚地识别它所在的房间。

问题:在 afterFind 方法中 Event 没有附属记录。具体来说,它没有 Room 记录。如果我进行正常/非包含的查找($this->Schedule->recursive 字段设置为 3),那么我确实会看到 Room 的数据。

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

4

2 回答 2

1

恕我直言,我猜您要将房间名称复制到活动的显示名称中的原因是为了查看?

我可以建议一个替代方法来解决这个问题吗?

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

在您看来:

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

鉴于与containable行为相关的文档的深度,它是如何工作的纯黑魔法,我个人不想修改它的任何代码来做你建议的事情。我非常感谢您努力实现的目标,但坚持 KISS 的原则,这似乎是正确的建议。

于 2013-05-02T22:29:47.893 回答
0

在许多情况下,可包含行为会将查询“拆分”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 是否接受Contain 中定义的连接。可以在此处找到有关手动指定联接的更多信息:联接

于 2013-05-02T22:28:17.113 回答