Bonjour,

Je suis débutant sous cakephp et je suis actuellement en train de réaliser un blog. Cependant, je rencontre quelques problèmes qui me bloquent.

En effet, mon blog utilise la version 3.0 de cakephp. Mais lorsque j'écris du code utilisant l'ORM de cakephp 3.0 rien ne fonctionne (erreur sur des lignes qui marchait très bien avant). En revanche, si j'écris du code "cakephp2", ça fonctionne.

Voici mon controller "PostsController.php" :

<?php

namespace App\Controller;
use App\Controller\AppController;

class PostsController extends AppController{

    public $paginate = [
            'limit' => 4,
            'order' => [
                'Posts.id' => 'desc'
        ]
    ];

    public function initialize(){
        parent::initialize();
        $this->loadComponent('Paginator');
    }

    public function index(){
        $this->set('posts', $this->paginate());
    }

    public function view($id = null){
        $post = $this->Posts->get($id);
        $this->set(compact('post'));

        $last_posts = $this->Posts->find('all', ['limit' => 5, 'order' => ['id' => 'desc']]);
        $this->set(compact('last_posts'));
    }
}

Tout fonctionne parfaitement mais regardé, cette ligne n'est pas sensé fonctionné étant donné que c'est de l'ORM de cakephp2.0, non ?

 $last_posts = $this->Posts->find('all', ['limit' => 5, 'order' => ['id' => 'desc']]);

Je souhaiterai également faire une association entre ma table "posts" et "comments" mais ça ne fonctionne pas avec l'ORM de cakephp3.0 (Si je marque le code de cakephp2.0 , ça fonctionne). Ce problème est vraiment très bizarre...

Merci d'avance pour votre aide,
Cordialement,

6 réponses


PhiSyX
Réponse acceptée

Yep, c'est bon mais du coup, je ne comprends pas ton souci maintenant que les deux méthodes fonctionnent :-)

$last_posts = $this
    ->Posts
    ->find()
    ->limit(5)
    ->orderDesc('id') // >= 3.0.12
;

Regardez cette page, deux codes plus bas, à partir de l'ancre http://book.cakephp.org/3.0/fr/orm/retrieving-data-and-resultsets.html#utiliser-les-finders-pour-charger-les-donnees vous verrez bien que les deux méthodes sont dispo et valides.

Pour les associations, c'est plus simple sous CakePHP 3 je trouve. http://book.cakephp.org/3.0/fr/orm/associations.html
Il te faut créer une classe App\Model\Table\PostsTable et dans une méthode spécifique (initialize) y ajouter les associations que tu souhaites, ici c'est une association de type $this->hasMany qu'il te faut. (Ca dépend de la structure de ta table (bdd) en fait :))
Il te faudra aussi modifier ton code dans ton controller App\Controller\PostsController::view et y ajouter l'option contain avec l'association lors de la récupération des données d'un post ($this->Posts->get($id, [...]) chez toi). Voilà en gros, mais tout est écrit dans la doc, qui est plus claire que mes explications simples & rapides.

Si tu fais les choses correctement, tu n'auras pas de mal à obtenir ce résultat :):

{
    "id": "1dede2ca-008d-44dd-ad72-e34063bdf447",
    "name": "Titre article",
    "content": "Contenu de l'article",
    //...
    "comments": [
        {
            "id": "c82727ec-de08-4fe9-be7b-9fd3f0652e6f",
            "parent_id": "0",
            "content": "Commentaire num\u00e9ro 1",
            "ref_id": "1dede2ca-008d-44dd-ad72-e34063bdf447",
            "child_comments": [
                {
                    "id": "8a673f35-39ce-4708-b00d-6594a1387139",
                    "parent_id": "c82727ec-de08-4fe9-be7b-9fd3f0652e6f",
                    "content": "R\u00e9ponse num\u00e9ro 1",
                    "ref_id": "1dede2ca-008d-44dd-ad72-e34063bdf447",
                    //...
                },
                //...
            ]
            //...
        },
        //...
    ],
    //...
}

Comment écris-tu ton code avec le chainage? ("$this->Posts->find()->...();", méthode orm cake3)

Sinon non, les deux méthodes, avec & sans chainage sont autorisés et valides parce qu'ils ont sûrement voulu ne pas perdre les utilisateurs voulant faire la migration vers cake3.

Non non j'utilise CakePHP 3 et ce bout de code ne fonctionne pas

$last_posts = $this->Posts->find('all', ['limit' => 5, 'order' => ['id' => 'desc']]);

Ha bon? Parce que j'utilise aussi Cakephp 3 et ça fonctionne très bien. J'obtiens le même résultat avec l'autre méthode de chainage... ^^

À vrai dire, c'est @MrSaooty qui m'a initié à cakephp. C'est pour cela qu'il s'est permis de te répondre :p

Je viens de tenter à nouveau de modifier cette ligne (ORM cakephp2) :

$last_posts = $this->Posts->find('all', ['limit' => 5, 'order' => ['id' => 'desc']]);

par cette ligne avec le chainage et ça fonctionne... :

$last_posts = $this->Posts->find()->limit('5')->order(['id' => 'desc'])->all();

En effet, j'ai réussi à régler tous mes problèmes, ça ne devait sûrement pas un problème venant du framework mais tout simplement de moi...
On me laissera l'excuse dû "C'était tard quand je codais... :D"