Recuperer le nom de categorie

Par Isselmoumg, il y a 10 ans


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

Lartak, il y a 10 ans

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.

Isselmoumg, il y a 10 ans

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é.

Lartak, il y a 10 ans

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

Isselmoumg, il y a 10 ans

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)); ?>
Lartak, il y a 10 ans

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.

kndeye, il y a 10 ans

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.

Isselmoumg, il y a 10 ans

Merci beaucoup, Mr sarluo

kndeye, il y a 10 ans

Ravi de t'avoir aidé xD