2013-06-05 3 views
1

Ceci est une question vraiment basique mais elle n'est pas expliquée dans the book.CakePHP: Model-> Model-> find()

Que se passe-t-il exactement lorsque vous combinez plusieurs modèles avant la méthode de recherche?

Ex: $stuff = $this->Article->User->find('all');

Comment est-ce différent que: $this->User->Article->find('all');

Pouvez-vous faire plus de deux? Il est clair que cela a quelque chose à voir avec les relations entre les modèles, mais je pensais que ceux-ci étaient définis dans les modèles, donc je ne sais pas ce qui se passe.

Répondre

5

Lorsque vous définissez une association sur un modèle. CakePHP l'instancie à l'exécution et le définit comme une propriété Object pour ce modèle.

class User extends AppModel 
{ 
     public $hasMany = array('Document'); 
} 

class Document extends AppModel 
{ 
} 

Dans l'exemple ci-dessus. User objets contiendra une propriété appelée Document, mais Document ne contiendra pas User.

class UsersController extends AppController 
{ 
    public $uses = array('User'); 

    public function index() 
    { 
      $this->User-find(...); // works 
      $this->User->Document->find(..); // works, because of the hasMany 

      $document = ClassRegistry::init('Document'); 
      $document->User->find(...); // does not work, not associated to User. 
    } 
} 

De plus, gardez à l'esprit que le nom de la propriété est l'alias de l'association. Pas le nom du modèle.

class User extends AppModel 
{ 
     public $hasMany = array(
      'Paper'=>array('className'=>'Document') 
    ); 
} 

class Document extends AppModel 
{ 
} 

Cela change le nom de la propriété à Paper

$this->User->Paper->find(..); // works as alias 

Utilise les alias sur les associations vous permet d'appliquer trouver des conditions afin qu'ils génèrent des résultats différents.

class User extends AppModel 
{ 
     public $hasMany = array(
      'Paper'=>array('className'=>'Document','conditions'=>array(....)), 
      'Resume'=>array('className'=>'Document','conditions'=>array(....)) 
    ); 
} 

Cela créerait deux propriétés pour les modèles User comme ça.

$this->User->Paper->find(..); // works as alias 
$this->User->Resume->find(..); // works as alias 

Mais, les conditions appliquent uniquement lorsque vous effectuez une découverte sur le modèle User.

+0

Ceci est utile et explique quand il peut être utilisé. Mais je ne suis toujours pas clair sur ce qu'il fait réellement. En d'autres termes, comment, le cas échéant, les données renvoyées sont-elles effec- tuées? – emersonthis

+1

Peut-être que c'est plus clair si je demande spécifiquement: Quel modèle est recherché? Le dernier de la chaîne? Ou sont tous les deux fouillés? Est-ce que '$ this-> User-> Paper-> find ('all')' retournerait tous les documents? Ou des documents ET des utilisateurs? – emersonthis

+1

'$ this-> Utilisateur-> Document == $ this-> Document' est vrai. Les deux objets sont la même instance du modèle 'Document'. Cake définit 'Document' en tant que propriété membre de' User' pour un accès pratique. Vous n'avez pas besoin de dire 'uses = array ('User', 'Document')' dans votre contrôleur. Puisque 'User' a déjà une référence à' Document'. Vous n'avez pas non plus besoin d'appeler 'classRegistry :: init ('Document')' depuis le modèle 'User'. – cgTag

Questions connexes