Construire une instruction conditionnelle sur plusieurs modèles (CakePHP 1.2.5)
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:
- Tout d’abord, il s’agit de SÉLECTIONNER les identifiants de tous les pays avec le code "US".
- 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?
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