Bonjour à tous,

Voilà j'essaye de faire un blog avec des catégories avec CakePHP. Le problème c'est que je rencontre des soucis lorsque je veux lier mes deux tables dans les modèles.

Un post à une seul catégorie et une catégorie peut avoir plusieurs posts. Rien de bien compliquer mais je n'arrive pas à afficher les posts avec leur catégorie. Le clés étrangère dans la table "posts" s'apelle "categories_id".

Mes modèles :

Post :

<?php
class Post extends AppModel{
    public $name = 'Post';
    public $hasOne = array(
        'Category' => array(
            'className' => 'Category',
            'foreignKey' => 'categories_id'
        )
    );
}

Category :

<?php
class Category extends AppModel{
    public $name = 'Category';
    public $hasMany = array(
        'Post' => array(
            'className' => 'Post'
        )
    );
    public $validate = array(
        'name' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Vous devez choisir un nom pour cette catégorie.'
        )
    );
}

Controller Posts:

<?php
class PostsController extends AppController{
    public $helpers = array('Html', 'Form');
    public function index(){
        $this->set('posts', $this->Post->find('all'));
    }
    public function add(){
    }
}

Vue Post/index.ctp:

<?php foreach ($posts as $post): ?>
    <?php debug($post) ?>
<?php endforeach ?>

Message d'erreur:

Database Error
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Category.categories_id' in 'on clause'
SQL Query: SELECT `Post`.`id`, `Post`.`date`, `Post`.`thumbnail`, `Post`.`title`, `Post`.`body`, `Post`.`categories_id`, `Category`.`id`, `Category`.`name` FROM `mabasededonnees`.`posts` AS `Post` LEFT JOIN `mabasededonnees`.`categories` AS `Category` ON (`Category`.`categories_id` = `Post`.`id`) WHERE 1 = 1
Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp

2 réponses


Bonjour,
le problème de liaison est simple, dans ton model Post, pour la liaison avec le model Cateogry c'est :
Post belongsTo Category
Category hasMany Post.

Ok, en effet ça marche par contre j'ai un deuxième problèmes par contre.

Le redirect dans la fonction add d'un de mes controller ne marche pas. Dans la fonction add du controller CreationsController je gère l'ajout de fichier, tous marche, l'image s'ajoute dans la base de données puis dans le dossier mais ça bloque après l'ajout de l'image et page blanche. Ça ne fais pas le redirect... Pourtant je passe bien le $success...

Voilà ma fonction d'ajout dans le controller CreationsController.php

public function add(){
        if( $this->request->is('post') ){

            $data = $this->request->data;

            $dir = IMAGES.date('Y');
            if( !file_exists($dir) )
                mkdir($dir,0777);
            $dir .= DS.date('m');
            if( !file_exists($dir) )
                mkdir($dir, 0777);

            $f = explode('.', $data'Creation']'screenshot']'name']);
            $ext = '.'.end($f);
            $filename = strtolower(Inflector::slug(implode('.', array_slice($f, 0, -1)), '-'));
            $tmp_name = $data'Creation']'screenshot']'tmp_name'];

            $success = $this->Creation->save(array(
                'title' => $data'Creation']'title'],
                'subtitle' => $data'Creation']'subtitle'],
                'url' => $data'Creation']'url'],
                'role' => $data'Creation']'role'],
                'customer' => $data'Creation']'customer'],
                'description' => $data'Creation']'description'],
                'webdesigner' => $data'Creation']'webdesigner'],
                'developper' => $data'Creation']'developper'],
                'integrator' => $data'Creation']'integrator'],
                'designer' => $data'Creation']'designer'],
                'screenshot' => date('Y').'/'.date('m').'/'.$filename.$ext
            ));
            if( $success ){
                move_uploaded_file($tmp_name, $dir.DS.$filename.$ext);
                $this->Session->setFlash('Création posté dans le portfolio !');
                $this->redirect(array('action' => 'index'));
            }else{
                $this->Session->setFlash('Impossible d\'ajouté !');
            }
        }
    }