Question

Disons que j'ai 3 modèles: Utilisateur, Région, Pays.

User belongsTo Region
Region belongsTo Country

Chacun de ces modèles utilise le comportement Containable. J'essaie de trouver des utilisateurs du pays avec le code «US». Voici ce que je tente:

$users = $this->User->find('all', array(
    'conditions' => array('Country.code' => 'US'),
    'contain'    => array('Region.Country'),
));

CakePHP sépare ceci en 2 requêtes:

  1. Tout d’abord, il s’agit de SÉLECTIONNER les identifiants de tous les pays avec le code "US".
  2. Ensuite, il utilise ces identifiants pour SÉLECTIONNER tous les utilisateurs qui se connectent à des régions region.country_id dans la liste des identifiants de pays précédemment récupérés.

En conséquence, je me retrouve avec des erreurs SQL dans mon application car mon tableau conditions contient une référence à Country.code, et la deuxième requête construite par Cake ne joint pas les pays.

La meilleure solution de Cake que je vois est de construire une sous-requête comme décrit dans Conditions de recherche complexes du manuel. Cependant, cela semble très compliqué, et est plus un bidouillage que je voudrais mettre en œuvre. Existe-t-il un moyen plus simple que je néglige?

Était-ce utile?

La solution

Nate Abele (ancien développeur principal de CakePHP) a écrit un article sur la réalisation de des jointures ad hoc qui pourraient aider.

Autres conseils

Mettez également les conditions dans le conteneur. E.g:

$users = $this->User->find('all', array('contain' => array(
    'Region' => array(
        'Country' => array(
            'conditions' => array('Country.code' => 'US'),
        ),
    ),
)));

Voir l'avant-dernier exemple dans the Containable manuel

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