Bonjour,
J'ai deux tables posts et categories, categories.id est une clé etrangère au niveau de la tables posts correspond category_id,
_j'ai une action view pour visualiser les details d'un post, maintenat je veux afficher le nom de la categorie du post et non seulement son id, pour ce faire j'ai procedé le suivant
au niveau du controller

 public function view($id) {
        if(!$id)
            throw new NotFoundException (__('Article invalid'));
        $post=$this->Post->findById($id,array(
      'fields'=>'*',
      'joins'=> array(
        array(
          'table'=>'categories',
          'alias'=>'Category',
          'type'=>'left',
          'conditions'=>array('Category.id=Post.category_id'
            )

          )

        )

      ) );
        if(!$post)
            throw new NotFoundException (__('Article n est pas trouvé'));
                    $this->set('article',$post);

    }

mais on me signale l'erreur suivante :

 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'field list'

SQL Query: SELECT *, Array FROM `blog_tp`.`posts` AS `Post` WHERE `Post`.`id` = 13 LIMIT 1 

est ce que vous pouvez m'aider la dessus, et je reste à votre disposition pour plus d'illustration.
Merci à l'avance

8 réponses


kndeye
Réponse acceptée

Bonsoir,
si tu as dans ta CategoriesTable

            $this->hasMany('Posts', [
                 'foreignKey' => 'category_id'
        ]);

Et dans PostsTable

            $this->belongsTo('Categories', [
                    'foreignKey' => 'category_id'
        ]);

Et après dans ton PostsController à l'action add tu mets

        $categories = $this->Posts->Categories->find('list', ['limit' => 20]);
        $this->set(compact( 'categories'));

Et enfin dans la vue add tu mets

        echo $this->Form->input('category_id', ['options' => $categories]);

J'espère que ça t'aidera.

Bonjour.
Si tu as respecté les conventions de CakePHP pour le nom du champ pour l'association, pourquoi tu n'utilises pas les associations du Framework au lieu de faire un join manuel dans ta requête ?
Et puis, si tu ne veux pas filtrer les champs à récupérer dans ta requête, il est inutile de préciser la clé fields et le joker, car CakePHP ne filtre pas les champs à récupérer par défaut.

Merci Mr Lartak,
mon objectif c'est de pouvoir recuperer le nom de la categorie à un post donné, mais meme le code ci-dessus,qui n'est pas optimisé, n'a pas fonctionné.

Je te conseille de vérifier l'utilisation de findBy.

Merci Mr Lartak,
j'ai pu realiser l'association entre table posts et categories, lorsque j'utilise la variable scaffold, la vu add me liste la liste des categories pour en choisir une,
mais au niveau de ma propre vu add dont le code est le suivant: je n'ai pas pu afficher la liste des categories

<?php echo $this->Form->create('Post', array('type' => 'file')); ?>
<?php echo $this->Form->input('titre', array('class' => 'class=form-control')); ?>
<?php echo $this->Form->input('category_id'); ?>
<?php echo $this->Form->input('contenu'); ?>
<?php echo $this->Form->input('avatar_file',array('label'=>'votre format jpg ou png ','type'=>'file')); ?>
<?php echo $this->Form->end('Ajouter'); ?>

avant la liaison j'ai listé les categories manuellement

<?php 
$options = array(1 => 'Terrains', 2 => 'Voitures'); 
<label>Categorie :</label>
 echo $this->Form->select('category_id', $options, array('escape' => false));
?>

De rien.
Par contre, le scaffolding est à la base fait pour être utilisé en mode dévelopement par exemple, tu ne devras pas l'utiliser en production.
Il est d'ailleurs obsolète depuis la V 2.5 :

Obsolète depuis la version 2.5: Le scaffolding dynamique sera retiré et remplacé dans 3.0
2.5 Guide de Migration : Le scaffold dynamique est maintenant déprécié et sera retiré dans 3.0.

Si tu veux ne pas avoir à définir les options pour le listing des catégories dans le Helper Form, il te faut transmettre les données depuis le controller, via la variable $categories et le Helper Form comprendra quelle correspond au champ category_id.

Merci beaucoup, Mr sarluo

Ravi de t'avoir aidé xD