Cercando di ottenere i dati "Città" da Evento-> Luogo-> Città utilizzando "contiene" in CakePHP
-
28-10-2019 - |
Domanda
Sto cercando di restituire un elenco di events
e di includere il city
in cui si trova.Tuttavia, la città è associata solo tramite il Venue
dell'evento.
Di seguito è riportato il codice che sto utilizzando.Restituisce tutti i dati corretti, ma non restituisce NESSUN dato di città (a parte il campo city_id in Venue, che non sono sicuro del motivo per cui sta restituendo).
Associazioni:
Event belongsTo Venue
Venue hasMany Event
Venue belongsTo City
City hasMany Venue
Codice:
$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,
)
)
)
),
));
Risposta bonus: (che ho attualmente chiesto in un'altra domanda StackOverflow ) - Le condizioni Date dovrebbero filtrare gli eventi visualizzati, ma invece filtrano solo i dati della data da mostrare.
RISPOSTA DI LAVORO: (grazie 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);
Soluzione
Suggerirei di evitare di utilizzare Containable.In alcuni casi genera troppe query.Un modo migliore per le query complesse è unire le tabelle "manualmente" .
Un'altra opzione che prenderei in considerazione in primo luogo è cercare nel modello "Venue" senza utilizzare Containable in questo modo: $this->Event->Venues->find('all', ...)
.In quanto luoghi direttamente associati a città ed eventi, dovrebbe essere possibile ottenere ciò che desideri senza ulteriori complessità.
Aggiornamento: dai un'occhiata alla domanda Come cambiare la sequenza dei" join "in CakePHP?
Altri suggerimenti
invece di contenere, hai provato a includere i dati della città nei campi stessi da fields=> array ('', '', 'City.name)