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);
È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top