2009-05-25 6 views
1

quelqu'un peut me dire quelle est la meilleure façon de faire quelque chose comme, d'un db commeQuelle est la bonne façon d'écrire Model-> find() dans CakePhp sur trois tables?

Table 1 
-id 
-data 
-foreign_key_id_table2 

Table 2 
-id 
-data 
-foreign_key_id_table3 

Table 3 
-id 
-data 

je dois sélectionner tous les éléments de la table une liée à tous les éléments dans le tableau 2 d'une table donnée 3 d'entrée quelque chose comme

select table1.data from table1 where table1.foreign_key_id_table2 in (select table2.id from table2 where table2.foreign_key_id_table3 = X) 

mais je dois le faire avec CakePHP et comme je suis nouveau avec elle, je ne peux pas comprendre comment

s'il vous plaît aider :)

Répondre

4

Ok, je vais essayer d'aider à "apprendre à un homme comment pêcher".

Les modèles de gâteau représentent des tables de base de données. Chaque modèle peut avoir associations défini, tel que belongsTo, hasMany, hasOne, etc. Quand vous définissez une association, le gâteau le reconnaît et obtient toutes les données relatives dont vous avez besoin. Par exemple, supposons que vous ayez un modèle Post et un commentaire de modèle. Si vous définissez une association entre eux (Post-hasMany-Comment, et Comment-belongsTo-Post), le gâteau fonctionnera la magie chaque fois que vous faites un Post-> find() ou Comment-> find()

Qu'est-ce que cela signifie?Si vous faites quelque chose comme ceci:

$ data = $ this-> Post-> findByTitle ('votre titre de poste');

La variable $ data contiendra non seulement les données de votre publication, mais également tous les commentaires associés. Vous pouvez toujours voir ce qui est là-dedans en appelant debug($data);

Le niveau de gâteau « profondeur » ira avec les données peuvent être réglés en utilisant le recursive propriété/paramètre, ou en utilisant le comportement Containable intégré.

Un autre avantage de définir des associations entre modèles (pour répondre à votre commentaire sur la réponse de Rob) est que vous n'avez pas besoin de mettre tous vos modèles dans le $ uses var. En fait, ce serait la mauvaise chose à faire.

Croyez-le ou pas, mais une fois que vous avez défini vos associations correctement, cela fonctionne:

class PostsController extends AppController 
{ 
    // not really needed, cake detects it automagically 
    var $uses = array('Post'); 

    function index() 
    { 
     $comments = $this->Post->Comment->find('all'); 
    } 
} 

Sweet, est-ce pas?

Dans votre cas, ce serait quelque chose comme ceci:

$this->Table1->find 
    (
     'all', 
     array 
     (
      'conditions' => array 
      (
       'Table2.foreign_key_id_table3' => X 
      ) 
     ) 
    ); 

Il y a beaucoup d'autres conseils utiles lorsque vous travaillez avec de gâteau fonctions intégrées et des classes, donc je vous suggère de prendre un certain temps apprendre le gâteau correctement, il vous facilitera la vie.

3

Je recommanderais d'utiliser la méthode find() de Cake pour les modèles. Tout ce que vous avez à faire est de créer les associations de modèles appropriées et Cake fera le travail pour vous. Dans votre cas, il ressemble au modèle Table1 belongsTo Table2 et Table2 belongsTo Tableau3.

Le tableau 2 aurait alors une relation hasOne ou hasMany avec le tableau 1 et le tableau 3 aurait la même relation avec le tableau 2.

Pour fournir un scénario réaliste, pensez à l'application de blog omniprésente. Un User peut créer Posts et un Post peut avoir plusieurs Comments:

Database

 
users 
- id 
- data 

posts 
- id 
- user_id 
- data 

comments 
- id 
- post_id 
- data 

User Modèle

 
class User extends AppModel { 
    $hasMany = array ('Post'); 

    // ... 
} 

Post Modèle

 
class Post extends AppModel { 
    $hasMany = array ('Comment'); 
    $belongsTo = array ('User'); 

    // ... 
} 

Comment Modèle

 
class Comment extends AppModel { 
    $belongsTo = array ('Post'); 

    // ... 
} 

Une fois que vous avez les associations en place, il suffit d'appeler la méthode find() de quel objet vous intéresse et gâteau de retourner les associés d'autres classes bien.

+0

Merci pour votre aide, je ne suis pas vraiment utilisé pour toutes ces CakePHP fonctions vaudous donc, si je suis bien cela dans le contrôleur CommentsController classe extends AppController { var $ utilise = array (« Commentaire », ' Post ',' Utilisateur '); ... avec les associations dans les modèles commentaire appartient à poster message appartient à l'utilisateur utilisateur a de nombreux messages quand je veux montrer tous les commentaires d'un utilisateur je dois trouver (« champ », array ('conditions' => array ('User.id' => x))); avec la condition Utilisateur même si je suis dans le contrôleur de commentaire comme j'ai inporté les autres modèles –

Questions connexes