Der Versuch, "Stadt" -Daten von Ereignis-> Veranstaltungsort-> Stadt mit 'Enthalten' in CakePHP abzurufen
-
28-10-2019 - |
Frage
Ich versuche, eine Liste mit events
zurückzugeben und den city
anzugeben, in dem er stattfindet.Die Stadt wird jedoch nur über den Venue
des Ereignisses zugeordnet.
Unten ist der Code, den ich verwende.Es werden alle korrekten Daten zurückgegeben, aber KEINE Stadtdaten (außer dem Feld city_id in Venue - ich bin mir nicht sicher, warum es zurückgegeben wird).
Assoziationen:
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,
)
)
)
),
));
Bonusantwort: (die ich derzeit in eine weitere StackOverflow-Frage ) - Die Datumsbedingungen sollen filtern, welche Ereignisse angezeigt werden. Stattdessen filtern sie nur, welche Datumsdaten angezeigt werden sollen.
ARBEITSANTWORT: (danke 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);
Lösung
Ich würde empfehlen, die Verwendung von Containable zu vermeiden.In einigen Fällen werden zu viele Abfragen generiert.Eine bessere Möglichkeit für komplexe Abfragen ist , Tabellen "manuell" zu verbinden .
Eine andere Option, die ich an erster Stelle in Betracht ziehen würde, ist die Suche im 'Venue'-Modell, ohne Containable wie folgt zu verwenden: $this->Event->Venues->find('all', ...)
.Da Veranstaltungsorte direkt mit Städten und Veranstaltungen verbunden sind, sollte es möglich sein, ohne zusätzliche Komplexität das zu erreichen, was Sie möchten.
Update: Sehen Sie sich die Frage Wie ändere ich die Reihenfolge der 'Joins' in CakePHP?
Andere Tipps
Haben Sie versucht, die Stadtdaten anstelle von Containable in die Felder selbst aufzunehmen, indem Sie das Feld fields=> ('', '', 'City.name) verwenden