Essayer d'obtenir des données «ville» de l'événement-> Lieu-> Ville en utilisant «contenir» dans CakePhp

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

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);
Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top