2009-12-28 4 views
3

Il ya quelques jours, j'ai découvert ce miracle appelé CakePHP donc je suis assez vert pour cela. Je besoin de construire une application de messagerie, j'ai donc suivi la convention et créé:Naming convention et rejoint dans CakePHP

Description de base de données:

Table des utilisateurs < user_id (clé primaire), fname, lname>.

Table des mails < mail_id (clé primaire), de (clé étrangère à user_id), à (clé étrangère à user_id), contenu, ouvert>.

Mes questions:

1) Selon la convention, une clé étrangère doit être appelée table liée + '_ id'. Comment dois-je appeler les colonnes s'il y a deux clés étrangères qui se rapportent à la même table. Comme de et vers la table des mails.

2) Je voudrais faire un joint intérieur entre les deux tables. Quelque chose comme:

SELECT user_id, mail_id 
FROM users 
INNER JOIN mails 
ON users.user_id =mails.to AND mails.opened=false. 

Mais je n'ai aucune idée comment le faire.

+1

Alors que sur le thème des conventions, vous devez nommer vos clés primaires simplement 'id', pas' user_id' et 'mail_id'. :) – deceze

Répondre

1

Je ne suis pas un expert moi-même, mais les informations suivantes sur le site CakePHP vous aider davantage: Multiple-relations-to-the-same-model

+0

salut, merci pour votre réponse. J'ai vu le tutoriel, dans leurs exemples, ils écrivent des résultats d'un appel à $ this-> Recipe-> find(). mais je suis vraiment désemparé à propos de ce qui est écrit dans Recette-> find() – special0ne

+0

alors vous pouvez avoir expérimenté avec la trouvaille de conplex aussi (http://book.cakephp.org/view/73/Retrieving-Your-Data# Complex-Trouver-Conditions-74). Si cela échoue, vous pouvez utiliser $ this-> Recipe-> query ($ sqlStatement). –

+0

La fonction Recette :: find() est héritée de la classe parente, vous n'avez donc pas à l'écrire. C'est écrit pour toi. Si vous voulez dire les arguments qui sont passés à la fonction, ceux-ci sont très bien documentés dans le manuel. Je vous recommande de faire le tutoriel de Cake, commencer à la fin, qui devrait vous aider avec ces questions de base. –

4

Lorsque vous devez faire deux rapports à la même table, vous devrez remplacer la convention par défaut . Dans votre exemple, je ferais 2 clés étrangères. Un nommé sender_id et un nommé recipient_id. Ensuite, vous les rejoindre dans le modèle comme ceci:

<?php 

class Mail extends AppModel { 
    //The Associations below have been created with all possible keys, those that are not needed can be removed 
    var $belongsTo = array(
     'UserSender' => array(
      'className' => 'User', 
      'foreignKey' => 'sender_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
      'UserRecipient' => array(
      'className' => 'User', 
      'foreignKey' => 'recipient_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
    ); 
} 
?> 

ensuite faire vos conditions, vous les référence comme ceci:

<?php 
    $this->Mail->find(array('conditions'=>array('Mail.opened'=>false))); 
?> 

... et de filtrer sur l'émetteur et le récepteur, Vos conditions ressembleraient à:

<?php 
    $this->Mail->find(array('conditions'=>array('UserSender.some_field'=>$someValue, 
               'UserRecipient.some_field'=>$someValue))); 
?>