Intentando obtener datos de "Ciudad" de Evento->Lugar->Ciudad usando 'contener' en CakePHP
-
28-10-2019 - |
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);
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)