Essayer d'obtenir des données «ville» de l'événement-> Lieu-> Ville en utilisant «contenir» dans CakePhp
-
28-10-2019 - |
Question
J'essaye de retourner une liste de events
, et inclure le city
où cela se déroule. La ville n'est associée que par l'événement Venue
pourtant.
Vous trouverez ci-dessous le code que j'utilise. Il renvoie toutes les données correctes, mais elle ne renvoie aucune données de la ville (à part le champ City_ID dans le lieu - ce qui ne sait pas pourquoi il revient).
Les associations:
Event belongsTo Venue
Venue hasMany Event
Venue belongsTo City
City hasMany Venue
Code:
$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,
)
)
)
),
));
Réponse bonus: (que j'ai actuellement demandé dans Une autre question de StackOverflow) - Les conditions de date sont censées filtrer quels événements s'affichent, mais à la place, ils filtrent uniquement les données de date à afficher.
Réponse de travail: (Merci 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);
La solution
Je recommanderais d'éviter d'utiliser le contenu. Il génère trop de requêtes dans certains cas. Une meilleure façon pour les requêtes complexes est pour rejoindre des tables "manuellement".
Une autre option que je considérerais à la première place est de rechercher dans le modèle de «lieu» sans utiliser de contenu comme ceci: $this->Event->Venues->find('all', ...)
. En tant que lieux directement associés aux villes et aux événements, il devrait être possible d'obtenir ce que vous voulez sans complexités supplémentaires.
Mise à jour: Jetez un œil à la question Comment changer la séquence des «jointures» dans CakePhp?
Autres conseils
Au lieu de contenir, avez-vous essayé d'inclure les données de la ville dans les champs lui-même par des champs => array ('', '', 'City.name)