2010-06-03 7 views
2

Je suis relativement nouveau à CakePHP, je me débrouille bien avec la documentation, mais j'ai essayé de trouver une solution à ce problème pendant des semaines et je ne trouve pas la solution, je suis sûr que c'est facile et peut-être même faisable, mais je ne sais pas comment le trouver (peut-être que je ne connais pas le jargon pour ce genre de choses)CakePHP associations de modèles à 3 niveaux de profondeur

Ma structure de modèle est comme ceci:

... et ainsi de suite avec les modèles utilisateur, ville, pays et transport. Ce que j'essaye de réaliser est d'obtenir toute l'information de l'arbre entier quand je recherche Trip.

<?php 
class TripController extends AppController { 
    function index() { 
     debug($this->Trip->find('first')); 
    } 
} 

Sorties

Array 
(
    [Trip] => Array 
     (
      [id] => 6 
      [created] => 2010-05-04 00:23:59 
      [user_id] => 4 
      [start_id] => 2 
      [end_id] => 1 
      [title] => My trip 
      [transport_id] => 1 
     ) 

    [User] => Array 
     (
      [id] => 4 
      [name] => John Doe 
      [email] => [email protected] 
     ) 

    [Start] => Array 
     (
      [id] => 2 
      [user_id] => 4 
      [country_id] => 1 
      [state_id] => 1 
      [city_id] => 1 
      [direccion] => Lincoln Street 
     ) 

    [End] => Array 
     (
      [id] => 1 
      [user_id] => 4 
      [country_id] => 1 
      [state_id] => 1 
      [city_id] => 4 
      [address] => Fifth Avenue 
     ) 

    [Transport] => Array 
     (
      [id] => 1 
      [name] => car 
     ) 
) 

Voici la question: Comment puis-je obtenir dans une requête toutes les informations dans l'arbre?

Je voudrais avoir quelque chose comme

Array 
(
    [Trip] => Array 
     (
      [id] => 6 
      [created] => 2010-05-04 00:23:59 
      [User] => Array 
       (
        [id] => 4 
        [name] => John Doe 
        [email] => [email protected] 
       ) 
      [Start] => Array 
       (
        [id] => 2 
        [user_id] => 4 
        [Country] => Array 
         (
          [id] => 1 
          [name] = Spain 
         ) 
        [State] => Array 
         (
          [id] => 1 
          [name] = Barcelona 
         ) 
        [City] => Array 
         (
          [id] => 1 
          [name] = La Floresta 
         ) 
        [address] => Lincoln Street 
       ) 
      [End] => (same as Start) 
      [title] => My trip 
      [Transport] => Array 
       (
        [id] => 1 
        [name] => car 
       ) 
     ) 
) 

Can CakePHP créer ce genre de données? Non seulement pour $this->Model->find() mais aussi pour $this->paginate() comme par exemple:

// filter by start 
    if(isset($this->passedArgs['start'])) { 
     //debug('isset '.$this->passedArgs['start']); 
     $start = $this->passedArgs['start']; 
     $this->paginate['conditions'][] = array(
      'OR' => array(
       'Start.address LIKE' => "%$start%", 
       'Start.State.name LIKE' => "%$start%", 
       'Start.City.name LIKE' => "%$start%", 
       'Start.Country.name LIKE' => "%$start%" 
      ) 
     ); 
     $this->data['Search']['start'] = $start; 
    } 

Il semble être une question difficile, mais je suis sûr que cela est largement documenté et fait, je vous en serais reconnaissant toute aide.

Répondre

6

Vous semblez avoir tout configuré OK. Tout ce que vous devriez avoir à faire est de définir la récursif à 2 et qui devrait vous donner un niveau supplémentaire à vos données (en supposant que vous avez mis en place toutes les relations correctement)

var $recursive =2; 
+1

Ou '$ this-> Trip-> find ('first', array ('récursive' => 2));' – bancer

+0

Tout simplement magnifique. Merci un million paullb et bancer! –

+0

cela semble être génial, mais - avec beaucoup d'associations, je ne peux pas utiliser 2 récursif sans avoir d'erreurs de mémoire - même si je le limite à un résultat (comme 'premier'). Des idées? – Dave

3

Une alternative, plus chirurgicale, solution qui particulièrement utile si vous avez besoin d'aller plus loin que 2 niveaux ou si vous avez beaucoup d'associations de 2e niveau dont vous n'avez pas besoin pour ce problème particulier est le Containable Behavior. Ceci est la documentation 1.2.x. Si vous utilisez v1.3.x, vous le trouverez here.

+0

merci Rob. Je vous remercie d'avoir pris le temps –

Questions connexes