0

我正在尝试返回一个列表events,并包括city它发生的位置。城市仅通过事件关联Venue

下面是我正在使用的代码。它返回所有正确的数据,但不返回任何城市数据(除了 Venue 中的 city_id 字段 - 我不确定它为什么返回)。

协会:

Event belongsTo Venue
Venue hasMany Event

Venue belongsTo City    
City hasMany Venue

代码:

        $this->Event->Behaviors->attach('Containable');
        $events = $this->Event->find('all', array(
            'limit' => 5,
            'order' => 'Event.created DESC',
            'fields' => array(
                'name',
                'description',
                'phone',
                'price_general',
                'price_child',
                'price_adult',
                'price_child',
                'tickets_url'
            ),
            'contain' => array(
                'Venue' => array(
                    'fields' => array(
                        'name',
                        'address',
                        'city_id',
                    ),
                    'City' => array(
                        'fields' => array(
                            'City.name',
                            'state'
                        ),
                        'conditions' => array(
                            'City.id' => 'Venue.city_id'
                        )
                    )
                ),
                'Schedule' => array(
                    'fields'=>array(),
                    'Date' => array(
                        'conditions'=>array(
                            'Date.start >=' => $start_date,
                            'Date.start <=' => $end_date,
                        )
                    )
                )
            ),
        ));

奖励答案:(我目前在另一个 StackOverflow 问题中问过) - 日期条件应该过滤显示哪些事件,但相反,它们只过滤要显示的日期数据。


工作答案:(感谢bancer)

    $this->Event->recursive = -1;
    $options['joins'] = array(
            array('table' => 'schedules',
                'alias' => 'Schedule',
                'type' => 'LEFT',
                'conditions' => array(
                    'Event.id = Schedule.event_id',
                )
            ),
            array('table' => 'dates',
                'alias' => 'Date',
                'type' => 'LEFT',
                'conditions' => array(
                    'Date.schedule_id = Schedule.id',
                )
            )
        );
        $options['fields'] = array(
            'Event.name',
            'Schedule.start_date',
            'Date.start',
        );
        $options['limit'] = 5;
        $events = $this->Event->find('all', $options);
4

2 回答 2

1

我建议避免使用 Containable。在某些情况下,它会生成太多查询。复杂查询的更好方法是“手动”连接表

我首先要考虑的另一个选择是在不使用 Containable 的情况下搜索“场地”模型,如下所示$this->Event->Venues->find('all', ...):作为与城市和活动直接相关的场地,应该可以在没有额外复杂性的情况下获得您想要的东西。

更新:看一下如何在 CakePHP 中更改“加入”的顺序?

于 2011-06-16T22:21:55.947 回答
0

您是否尝试通过 fields=> array('','','City.name) 在字段本身中包含城市数据而不是可包含的

于 2011-06-16T21:32:36.620 回答