2010-10-28 25 views
2

En fait, je l'ai modèles suivants dans CakePHP:hasMany réduit à hasOne dans CakePHP

utilisateur (id, nom d'utilisateur) photo (id, user_id, chemin)

j'ai mis en place relation suivante: Utilisateur hasMany photo .

maintenant, sur un écran, je voudrais lister les utilisateurs, et montrer une photo aléatoire à côté de chaque utilisateur. i essayé la mise en place suivante relation:

utilisateur hasOne SamplePhoto (où SamplePhoto est juste modèle photo)

mais lorsque l'utilisateur a deux photos par exemple, il est répertorié deux fois sur la liste. En gros, ma question est: pouvez-vous réduire hasMany relation à hasOne, sans ajouter de champs au schéma de table présenté ci-dessus? Je voudrais dire au gâteau - trouver le premier enregistrement dans la table de photo qui correspond à un certain user_id.

Répondre

0

Tu ferais quelque chose comme:

$user = $this->User->find('first', array('conditions' => 
       array('username'=>$this->data['User']['username'], 
         'active'=>true))); 
+0

Ceci trouvera le premier utilisateur – Leo

2

si vous ne trouvez un comme $ this-> Utilisateur-> lire (null, $ id), le retour sera un tableau qui ressemble à quelque chose comme:

Array 
(
    [User] => Array 
     (
      [id] => 121 
      [username] => tom 
     ) 

    [Photo] => Array 
     (
      [0] => Array 
       (
        [id] => 123 
        [user_id] => 121 
        [path] => Somewhere 
       ) 
      [1] => Array 
       (
        [id] => 124 
        [user_id] => 121 
        [path] => SomeOtherPlace 
       ) 
     )    
) 

De ce tableau, vous pouvez choisir la photo comme bon vous semble, que ce soit la première:

$this->data['Photo'][0] 

la dernière:

$this->data['Photo'][count($this->data['Photo'])] 

un enregistrement explicite:

$this->data['Photo'][3] 

ou par des moyens aléatoires:

$this->data['Photo'][$rnd] 
2

Ne pas rendre plus compliquée qu'elle doit être. :)

$data = $this->User->Photo->find('first', 
     array('conditions' => array('Photo.user_id' => $id))); 

vous donne une photo en $data['Photo'] avec l'utilisateur attaché à $data['User'].

3

Vous pouvez également utiliser le Containable behaviour puis mettre en place quelque chose comme:

$this->User->find(
    'all', 
    array(
     'contains' => array(
      'Photo' => array(
       'order' => 'rand()', 
       'limit' => 1 
      ) 
     ) 
    ) 
); 

Vous devriez alors obtenir quelque chose comme

Array 
(
[User] => Array 
    (
     [id] => 121 
     [username] => tom 
    ) 

[Photo] => Array 
    (
     [0] => Array 
      (
       [id] => 123 
       [user_id] => 121 
       [path] => Somewhere 
      ) 
    )    

)