Salut à tous,
voilà, je cherche à comprendre le concept de relation entre tables avec cakePHP.
voici mon exemple :
j'ai une table posts {id,title,body,created,modified}, une table catagories{id,nom,created,modified} et une table de relation categories_posts {id,categorie_id,post_id}.
Dans cakePHP, j'ai les modèles suivant :

class Post extends AppModel
{
var $name = 'Post';
}

class Categorie extends AppModel
{
var $name = 'Categorie';

public $hasAndBelongsToMany = array(
'Post' => array(
'className' => 'Post',
'joinTable' => 'categories_posts',
'foreignKey'=>'categorie_id',
'associationForeignKey' => 'post_id',
)
);
}

Voici le controleur categories
class CategoriesController extends AppController {
var $name = 'Categories';
var $uses=array("Categorie","Post");
function index() {
print_r($this->Categorie->find("all"));
$this->set('categories', $this->Categorie->find('all'));
}
}

le print_r est la pour essayer de visualier l'ensemble des posts d'une catégorie ce qui ne marche pas.
Comment doit on procéder ?

10 réponses


Salut,
Déjà tu respectes pas les conventions de Cake pour table categories_posts il faut changer categorie_id en category_id (car c'est de l'anglais)

et pour récupérer tous les posts d'un catégorie il faut associer les modèle dans le find
Exemple:

debug($this->Post->Category->find('all'));
// Affichera
/*
array(
    (int) 0 => array(
        'Category' => array(
            'id' => '1',
            'name' => 'news',
            'created' => '2015-01-29 14:17:59',
            'modified' => '2015-01-29 14:17:59'
        ),
        'Post' => array()
    ),
    (int) 1 => array(
        'Category' => array(
            'id' => '2',
            'name' => 'jquery',
            'created' => '2015-01-29 14:18:09',
            'modified' => '2015-01-29 14:18:09'
        ),
        'Post' => array()
    )
)
*/

Pour l'exemple j'ai mis des trucs au hasards ;)
Et n'utilise pas var pour déclarer tes variables de classe utilise public, protected ou private (var c'est obsolète) et change bien ton foreign_key en "category_id" .

mnico
Auteur

Dans ton exemple, tu utilises le controleur Categories ou celui du Post ?
que veux tu dire par "il faut associer les modèle dans le find" ?
Désolé pour ces questions qui peuvent parait être évidente, mais chaque framework à sa propre logique.

Si tu es dans le controller Posts tu prend le model Post en premier

$this->Post->Category->find('all');

Si tu es dans le controller Categories tu prend le model Category en premier

$this->Category->Post->find('all');

En gros je dis je veux toutes les categories et tous les posts donc $this->Category->Post->find('all');

N'oublie de supprimer tes var et de les remplacer par public, protected ou private et de modifier ta table (categories_posts.category_id) et tes fichier (Model/Category.php)

mnico
Auteur

Ma table de categorie s'appelle categories, le model categorie.php
j'ai remplacé categorie_id par category_id dans categories_posts
mes controleurs s'appellent :
CategoriesController
PostsController
et donc dans mon CategoriesController, je mets print_r($this->Categorie->Post->find("all"));
mais ça me sort uniquement les categories et non les posts liés

mnico : Appel ton model Category et non Categorie dans un premier temps (Anglais oblige :) et c'est plus propre :P)
Ensuite, l'utilisation des contain ne serait-il pas une solution ici ?

mnico
Auteur

Si je l'appelle Category, je devrais appeler aussi la table category.
Ce que j'ai compris de cakephp, c'est qu'il est accès sur le nommage et non la configuration (comme symfony par ex).
Ca donne à cakephp une certaine souplesse, mais faut pas se louper sur le nom des éléments.
Au final, category ou categorie, c'est le même problème, il faut que la chaine model-controleur-vue reste logique.
Avez vous un lien, un tuto donnant un exemple concret (table, model, controleur) de création de liaison?
Je suis tombé sur certian sites dont l'ex ne fonctionnait pas car soit erreur soit ex non complet.
merci

Bonsoir.
Avez vous un lien, un tuto donnant un exemple concret (table, model, controleur) de création de liaison?
Bien sûr, mais ce n'est pas la peine de te donner des liens, vu que Grafikart à fait une multitude de tutoriels sur CakePHP, mais aussi une formation qui reprend une bonne partie de toutes les bases à connaître sur CakePHP ainsi que quelques spécificitées qui peuvent être très utiles.

Sur ce, bon visionnage.

mnico
Auteur

en effet, mais elles sont payantes !

Bonsoir.
Que le code source de certains tutoriels/formations soient payants, je ne dis pas le contraire, mais pour la plus grande partie, la visualisation des vidéos des tuoriels/formations ne le sont pas.