Pregunta

Estoy intentando devolver una lista de events, e incluir el city donde se está llevando a cabo.La ciudad sólo está asociada a través del evento Venue aunque.

A continuación se muestra el código que estoy usando.Devuelve todos los datos correctos, pero no devuelve NINGÚN dato de la ciudad (aparte del campo city_id en Venue, que no estoy seguro de por qué devuelve).

Asociaciones:

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

Respuesta extra:(que he preguntado actualmente en otra pregunta de StackOverflow) - Se supone que las condiciones de Fecha filtran qué eventos se muestran, pero en cambio, solo filtran qué datos de Fecha se muestran.


RESPUESTA DE TRABAJO:(gracias banquero)

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

Solución

Recomendaría evitar el uso de Containerable.Genera demasiadas consultas en algunos casos.Una mejor manera para consultas complejas es unir tablas "manualmente".

Otra opción que consideraría en primer lugar es buscar en el modelo 'Venue' sin usar Containable de esta manera: $this->Event->Venues->find('all', ...).Como lugares directamente asociados con ciudades y eventos, debería ser posible obtener lo que desea sin complejidades adicionales.

Actualizar: echa un vistazo a la pregunta ¿Cómo cambiar la secuencia de 'uniones' en CakePHP?

Otros consejos

en lugar de contenible, ¿intentó incluir los datos de la ciudad en los campos mediante campos=> matriz('','','Ciudad.nombre)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top