我正在尝试返回events
的列表,并将city
包含在其中。该城市仅通过活动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,
)
)
)
),
));
奖金回答:(我目前在another StackOverflow question中提出要求) - 日期条件应该过滤哪些事件显示,但相反,它们只过滤要显示的日期数据。
工作答案:(感谢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);
答案 0 :(得分:1)
我建议避免使用Containable。在某些情况下,它会生成太多查询。复杂查询的更好方法是to join tables "manually"。
我首先要考虑的另一个选择是搜索'Venue'模型而不使用像这样的Containable:$this->Event->Venues->find('all', ...)
。作为与城市和活动直接相关的场地,应该可以在没有额外复杂性的情况下获得您想要的东西。
答案 1 :(得分:0)
而不是包含,您是否尝试通过字段=&gt;将字段数据包含在字段中?阵列( '', '','City.name)