2009-10-27 17 views
0

Disons que j'ai 3 modèles: Utilisateur, Région, Pays.Création d'une instruction conditionnelle sur plusieurs modèles (CakePHP 1.2.5)

User belongsTo Region 
Region belongsTo Country 

Chacun de ces modèles utilise le comportement Contenable. 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 se sépare en ce 2 requêtes:

  1. D'abord, il est l'ID de la sélection pour tous les pays avec le code 'US'.
  2. Ensuite, il utilise ces identifiants pour sélectionner tous les utilisateurs qui joignent des régions où region.country_id est dans cette liste d'ID de pays précédemment récupérée.

En conséquence, je me retrouve avec des erreurs SQL dans mon application depuis mon tableau conditions contient une référence à Country.code, et la deuxième requête que le gâteau ne construit pas REJOIGNEZ pays.

La meilleure solution Cake que je vois est de construire une sous-requête comme décrit dans la partie Complex Find Conditions du manuel. Cependant, cela semble très compliqué, et est plus d'un hack que je voudrais mettre en œuvre. Y a-t-il un moyen plus facile que je néglige?

Répondre

2

Nate Abele (ancien développeur principal de CakePHP) a écrit un article sur comment faire ad hoc joins qui pourrait aider.

+0

Cool, je vais essayer bientôt ... ne pas réaliser les clés du tableau «conditions de (entre autres, comme ' fields 'et' group ') pourraient être passés dans le tableau contains. Je vais donner la coche si ça marche. :) –

1

Placez également les conditions dans le conteneur. Par exemple:

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

Voir le deuxième-dernier exemple dans the Containable manual

Questions connexes