Попытка получить данные "City" из Event-> Venue-> City с использованием'rate 'в CakePHP - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь вернуть список 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,
                        )
                    )
                )
            ),
        ));

Бонусный ответ: (который я сейчас задал в другой вопрос StackOverflow ) - Предполагается, что условия Date фильтруют события, которые появляются, но вместо этого,они только фильтруют данные даты, которые нужно показать.


РАБОЧИЙ ОТВЕТ: (спасибо 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);

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Я бы рекомендовал избегать использования Containable. В некоторых случаях он генерирует слишком много запросов. Лучший способ для сложных запросов - объединить таблицы "вручную" .

Другой вариант, который я бы рассмотрел в первую очередь, - это поиск по модели «Место действия» без использования Containable, например: $this->Event->Venues->find('all', ...). Поскольку объекты, непосредственно связанные с городами и событиями, должны иметь возможность получить то, что вы хотите, без лишних сложностей.

Обновление: взгляните на вопрос Как изменить последовательность 'соединений' в CakePHP?

0 голосов
/ 17 июня 2011

вместо содержимого, вы пытались включить данные города в сами поля с помощью fields => array ('', '', 'City.name)

...