Der Versuch, "Stadt" -Daten von Ereignis-> Veranstaltungsort-> Stadt mit 'Enthalten' in CakePHP abzurufen

StackOverflow https://stackoverflow.com/questions/6378701

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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top