2010-10-23 2 views
2

J'essaie obtenir tous commments relateed à mon post actuel, je le fais comme suit:CakePHP - Comment pourrais-je recevoir un objet connexe?

$this->Post->Comment->find('all', array('conditions' => array('post_id' => $id))); 

mais à mon avis, il est un peu mal à l'aise. Pourquoi devrais-je donner post_id? N'est-il pas évident que je veux Comment en rapport avec le courant Post?

Répondre

0

Si vous ne spécifiez pas les conditions ($this->Post->Comment->find('all');), vous obtiendrez tous les commentaires avec leurs dossiers connexes.

Il est conseillé de spécifier le nom du modèle dans les conditions suivantes: $this->Post->Comment->find('all', array('conditions' => array('Comment.post_id' => $id)));. De cette façon, vous obtiendrez les commentaires pour la publication spécifique et toutes les données associées (aux commentaires).

Si vous ne voulez pas ensemble 'conditions' vous devez indiquer l'identifiant explicitement comme Leo mentionné (contrôleur de poste):

$this->Post->id = $id; 
$this->Post->read(); 

De cette façon, vous obtiendrez le message et toutes les données qui lui sont associés.

Notez que dans la première méthode vous récupérez toutes les données associées aux commentaires et dans la deuxième méthode - toutes les données associées à la publication.

+0

Thx, mais comment pourrais-je maintenant afficher les commentaires sur la vue? –

+0

'debug ($ data);' dans la vue. Les commentaires devraient être dans '$ data ['Comment']; – bancer

1

$this->Post->Comment-> ... se réfère à la structure du modèle. $this indique cette instance de cette classe, pas l'enregistrement en cours.

Donc $this est le PostsController, $this->Post est le modèle de la poste et $this->Post->Comment est le modèle de commentaire. Aucun d'entre eux ne fait référence à un enregistrement spécifique.

$this->Post->id ne sera fixée si une requête précédente (dans cette méthode) a récupéré un résultat sans ambiguïté et je ne compter sur qu'il soit réglé immédiatement après $this->MyModel->save($data) sinon je mis explicitement, comme:

$this->MyModel->id = $id; 

Personnellement , je le ferais comme suit et récupérer toutes les données associées requises dans une instruction:

$this->Post->contain(array('Comment')); // If you're using containable, which I recommend. Otherwise just omit this line. 
$this->Post->read(null,$id); 

maintenant, vous aurez la Poste et ses commentaires associés dans un tableau comme celui-ci:

Array 
( 
    [Post] => Array 
     (
      [id] => 121 
      [title] => Blah Blah an More Blah 
      [text] => When the bar is four deep and the frontline is in witch's hats what can be done? 
      [created] => 2010-10-23 10:31:01 
     ) 
    [Comment] => Array 
     (
      [0] => Array 
       (
        [id] => 123 
        [user_id] => 121 
        [title] => Alex 
        [body] => They only need visit the bar once in the entire night. 
        [created] => 010-10-23 10:31:01 
       ) 
      [1] => Array 
       (
        [id] => 124 
        [user_id] => 121 
        [title] => Ben 
        [body] => Thanks, Alex, I hadn't thought of that. 
        [created] => 010-10-23 10:41:01 
       ) 
     ) 
) 

... et vous obtenez les commentaires comme celui-ci:

$comments = $this->data['Comment']; 

Tout ce que vous voulez (que vous pouvez régler dans l'appel contain()) au sujet de ce poste est renvoyé dans un paquet à portée de main. En passant, lisez le comportement du Containable si vous ne l'avez pas déjà fait. Le plus tôt vous commencez à l'utiliser, la vie plus facile deviendra.

+0

L'utilisation de containable est redondante ici. Tu n'en a pas besoin. Vous n'avez pas besoin de perdre la mémoire pour exécuter des classes inutiles. – bancer

+0

Pas nécessairement - Je l'ai inclus comme une invite à l'utiliser et explorer son utilisation. La publication peut être associée à des utilisateurs, des images ou autres, mais nous ne recherchons que des commentaires ici. L'utiliser comme ceci va limiter le retour Post + commentaires. Notez que je l'ai omis si vous ne l'utilisez pas. Si vous l'êtes, la classe est déjà chargée, donc perdre de la mémoire est sans importance. – Leo

+0

La possibilité d'éviter le gaspillage de mémoire et le temps de traitement en utilisant containable est bien plus important que le temps de chargement de la classe. – Leo

Questions connexes