Bonsoir,
je fais la formation CakePHP, j'en suis aux Associations : http://www.grafikart.fr/formation/cakephp/associations-model (14min37sec pour être précis, le moment d'associer Post dans le model Category)
Je suis à la lettre le code écrit, et malgré ca j'ai une erreur "Error: Call to a member function find() on a non-object" ligne 176
Category.php
<?php
class Category extends AppModel {
public $hasMany = array('Post');
}
PostsController.php
<?php
class PostsController extends AppController {
public function index (){
// avec $hasMany dans le Model Category on peut appeler Category depuis Post
$categories = $this->Post->Category->find('all');
// ce qui évite d'avoir à charger le model à la main :
//$this->loadModel('Category');
//$categories = $this->Category->find('all');
debug($categories);
$this->set(compact('posts'));
}
La table 'posts' a cette forme :
id
name
slug
content
created
category_id
la table 'categories' a cette forme
id
name
slug
post_count
la ligne 176 correspond à
$categories = $this->Post->Category->find('all');
(toutes les lignes avant la 176 ne sont que des commentaires, mis à part celle que j'ai écrit au dessus).
Le problème n'apparait pas quand je charge à la main le model Category dans le PostsController, cf. les deux lignes commentées du dessous.
$this->loadModel('Category');
$categories = $this->Category->find('all');
le 'debug($categories);' avec le loadModel fonction, cf. ci-dessous
array(
(int) 0 => array(
'Category' => array(
'id' => '1',
'name' => 'Mes vidéos',
'slug' => 'videos',
'post_count' => '2'
),
'Post' => array(
(int) 0 => array(
'id' => '3',
'name' => 'mon premier article modifié par controller',
'slug' => 'premier-article-controller',
'content' => 'Pas de contenu.',
'created' => '2013-08-06 15:19:43',
'category_id' => '1',
'url' => array(
'controller' => 'posts',
'action' => 'view',
'id' => '3',
'slug' => 'premier-article-controller'
)
),
(int) 1 => array(
'id' => '7',
'name' => 'titre : 531',
'slug' => 'slug-37',
'content' => 'contenu8',
'created' => '2013-08-06 15:47:17',
'category_id' => '1',
'url' => array(
'controller' => 'posts',
'action' => 'view',
'id' => '7',
'slug' => 'slug-37'
)
)
)
), etc...
Il semble que l'association ne se fasse pas correctement. J'ai cherché sur le forum de GrafikArt, sur google et d'autres forums, mais je n'ai pas trouvé mon erreur... Help !
PS : C'est dommage que les commentaires ne soient pas disponibles dans la formation, j'aurais posté ça la bas.
Oui j'ai bien cette relation, mais ton commentaire m'a permis de trouver mon erreur
Post.php
public $belongsTo = array(
'Section' => array(
'className' => 'Category',
'foreignKey' => 'category_id',
'fields' => 'name',
'counterCache' => true,
)
);
alors qu'il fallait nommer la relation 'Category' pour utiliser
$this->Post->Category->find('all');
ou si je veux continuer à nommer cette relation 'Section', il faut écrire
$this->Post->Section->find('all');
Par contre je ne comprends pas pourquoi il faut un $belongsTo avant d'avoir un $hasMany, je débute mais j'aimerai comprendre cela avant de continuer.
Merci d'avance et merci Antho07 pour ton coup de main.
Lorsque tu appelles tu le controller post, cakephp charge le controller, charge le modèle associé (puis laction la vue jusquau rendu de la page).
Si tu as rien dans ton modèle Post, il va juste faire les constructions standards présente dans le Modèle du coeur du php (dont ton modèle hérite), c'est à dire instancier le modèle nommer la table posts, et divers autres trucs, peu importe.
Donc comment peut-il savoir que il y a un lien avec category??
Maintenant si tu lui mets un $belongsTo .. .categoty
Quand il va chercher le modèle il saura que le post appartient à une category ,donc il va charger le modèle Category, puis construire les "parametres " de relation disons, c a dire la clé étrangère etc... .
L'instance du modèle Lié est cree dans le modèle Premier. Donc accessible depuis le premier dans le controller.(d'où
$this(controller)->Post(objet contenant l'instance du modèle) ->Category(objet contenant l'instance du modèle) )
Puis bon après il a la liaison, sur les finds etc... il fait ça bien et sort ce qu'on veut au bon endroit.