Pergunta

Estou tentando retornar uma lista de events e incluir o city onde está ocorrendo.A cidade é associada apenas por meio do Venue do evento.

Abaixo está o código que estou usando.Ele retorna todos os dados corretos, mas não retorna NENHUM dado de cidade (exceto o campo city_id em Venue - que não tenho certeza do motivo pelo qual está retornando).

Associações:

Event belongsTo Venue
Venue hasMany Event

Venue belongsTo City    
City hasMany Venue

Código:

        $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,
                        )
                    )
                )
            ),
        ));

Resposta bônus: (que eu já perguntei em outra questão StackOverflow ) - As condições de data devem filtrar quais eventos aparecem, mas, em vez disso, estão filtrando apenas quais dados de data mostrar.


RESPOSTA DE TRABALHO: (obrigado bancário)

    $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);
Foi útil?

Solução

Eu recomendaria evitar o uso de Containable.Em alguns casos, ele gera muitas consultas.Uma maneira melhor de fazer consultas complexas é juntar tabelas "manualmente" .

Outra opção que eu consideraria em primeiro lugar é pesquisar através do modelo 'Local' sem usar Containable como este: $this->Event->Venues->find('all', ...).Como locais diretamente associados a cidades e eventos, deve ser possível obter o que você deseja sem complexidades extras.

Atualização: dê uma olhada na pergunta Como alterar a sequência de 'junções' no CakePHP?

Outras dicas

em vez de conter, você tentou incluir os dados da cidade nos próprios campos por campos=> matriz ('', '', 'Cidade.nome)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top