Bonjour,

Tout d'abord merci beaucoup pour ces tutos et ces vidéos de formations qui m'aident depuis plusieurs années déjà !

J'ai une question sur l'utilisation des Models dans CakePHP.
J'ai cherché sur la doc des versions ultérieures à 2.x, mais je n'ai pas trouvé la réponse (ou alors elle ne m'a pas paru évidente).

Je voudrais savoir comment dans un controller on peut utiliser plusieurs models.
Exemple : en ce moment je développe en solo un gestionnaire de parties de blind test. J'ai une classe Game (pour les parties), une classe Quiz (pour les différents quiz / thème) et une classe Team (pour les équipes qui jouent).
Dans mon controller Game, j'ai une fonction current_quiz() associée à la vue du même nom.
C'est la vue durant laquelle une manche va se dérouler et où l'on va attribuer les points à une Team.

Mon problème c'est que dans cette vue je peux récupérer les données Game de la partie ; j'ai aussi besoin des données Quiz et Team.
Suis-je obligé de passé par $this->Game->query() ou associer les models entre eux, ou alors est-ce que je peux appeler les autres models (qui n'ont pas forcément d'association avec Game) ?

J'espère que je suis assez clair :)
Merci d'avance pour vos réponses.

5 réponses


Ch0c4
Réponse acceptée

C'est vrai que c'est pas très clair mais voila ou c'est marqué dans la doc http://book.cakephp.org/2.0/fr/controllers.html#Controller::$uses

en gros tu peux écrire dans ton contrôleur

class RecipesController extends AppController {
    public $uses = array('Recipe', 'User');
....
}

et la tu peux utiliser la table Recipe et user à toi d'adapter

Amelovitch
Auteur
Réponse acceptée

Ok merci beaucoup !

Ch0c4
Réponse acceptée

Tu peux le faire dans PagesController si sa t'enchante je te donne le début du code pour t'aider et à toi d'adapter

class PagesController extends AppController
{
    public $uses = array('Team', 'Game');
    public function highScore()
    {
        $team = $this->Team->find('all');
        $game = $this->Game->find('all');
    }
}

Normalement dans $game et dans $team il y a toutes tes entrées des table Team et Game

N'oublie pas de changer le fichier Config/routes.php comme sa (sinon sa va exécuter la fonction display automtiquement

//Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

J'espère t'avoir aidé.

Si tu veux charger un modèle différent du controller courant sans faire de liaison entre les modèles concernés via l'une des liaisons suivantes :

public $hasOne = array();
public $hasMany; = array()
public $belongsTo = array();
public $hasAndBelongsToMany = array();

Je te conseillerais plutôt d'utiliser le système suivant :

$this->loadModel('Model');
$this->Model->findByUserId($this->Session->read('Auth.User.id');

Mais bon, faire les associations entre les modèles par héritage, c'est quand même le mieux à faire.
Car le système que je t'ai montré, c'est surtout manière de faire des tests ou si tu as besoin de récupérer une info sur toutes tes pages par exemple à travers l' AppController.

Pour les associations, je les ai seulement sur les tables que j'ai liées (gérer avec des clés étrangères, tables associatives ...).
Dans mon cas, je veux récupérer des infos pour les vues mais qui n'ont pas de lien dans ma base.

J'ai d'ailleurs un autre question ; j'ai compris que PagesController ne servait qu'aux pages statiques, et donc impossible d'utiliser un modèle à l'intérieur.
J'ai une table Team (équipes) avec un champ highscore, et une table Game (partie) avec aussi un champ highscore (meilleur score).
Ce qui me plairait c'est d'utiliser une seule vue pour afficher deux tableaux de meilleurs scores, un pour Team et un pour Game.
Vu que je ne peux pas passer par PagesController, quelle est ma solution ?