Bonjour,

J'ai une page qui affiche tout les articles disponnible sur le site ,

$d = $this->Post->find('all');
$this->set('posts', $d);

Voilà ce que cela me rend :

Je voudrais ensuite récuperer le nom de la categorie avec la conditon id = Post.category_id. Ensuite pouvoir relancer ca dans par exemple
(int) 6 => array( 'Post' => array('category_name' => ?'))

7 réponses


Bonsoir.
Si tu utilises le behavior Containable, il te suffit par exemple de faire :

$d = $this->Post->find('all', [
    'contain' => ['Category.name']
]);
$this->set('posts', $d);

Il te faut par contre avoir bien défini tes associations.
Ensuite lors de ta boucle pour l'affichage :

foreach ($posts as $post):
    /* ... */
    echo $post['Post']['Category']['name'];
    /* ... */
endforeach;

Bonsoir,

$d['posts'] = $this->Posts->find('all')->contain(['Categories']);
$this->set($d);

Puis :

foreach($posts as $post):
    print($post->category->name);
endforeach;

Merci vous deux pour vos réponses.

Comment va t-il savoir qu'il doit aller chercher dans la table 'Categories' et que c'est par rapport a son id ?

Bonjour, cela est une jointure afin de pouvoir récupérer les informations d'une catégorie liée à un article.

$d['posts'] = $this->Post->find('all')->contain(['Categories']);
            $this->set('posts', $d);

            debug($d);

-->

Fatal Error
Error: Call to a member function contain() on array 

Faut t-il une foreign key dans la base de donnée pour le contain?

Bonjour, il vous faut une clé dans votre table posts nommer : category_id.
Ceci dit l'erreur à aucun rapport avec la clé étrangère ou non.... Il ne trouve pas la fonction contain()l, essayer de tout passée en tableau, avec le find();

EDIT (18:36) :
Le souci est résolu, il suffisait de manipuler les modèles (actsAs, belongsTo), et de procédé a la jointure.