CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 18-11-2015 21:13:21

novax
Crêpe Suzette
Date d'inscription: 27-10-2015
Messages: 9

[Cake 3] Méthode du finder avec associations imbriquées ?

Bonjour !


J'ai des problèmes pour gérer les nested assocs :
Actuellement, j'ai le code suivant dans un de mes contrôleurs :

Code: php

  1. $this->set('user', $this->Users->find('withMark')->where(['id' => $id])->contain([
  2.   'Games' => [ // notes des jeux qu'un user possède directement
  3.     'finder' => 'withMark' // ramène les notes
  4.   ],
  5.   'Loans.UserGames.Games' => [ // notes des jeux qu'un user a emprunté
  6.     'finder' => 'withMark' // ne ramène pas les notes T-T
  7.   ]
  8. ])->first());

L'objectif étant ici de récupérer les notes des jeux qu'un utilisateur possède ou a emprunté (les utilisateurs ont des jeux, ils se les prêtent, les notent de 0 à 5 avec des petites étoiles, ...). Les jeux Games sont des modèles et les jeux UserGames sont des exemplaires.


La méthode du finder est définie dans la GamesTable :

Code: php

  1. public function findWithMark(Query $games) {
  2.   $marks = $this->find();
  3.  
  4.   $games->leftJoin(['GameMarks' => $marks
  5.     ->select([
  6.       'game_id' => 'game_id',
  7.       'sum'     => $marks->func()->sum('mark'),
  8.       'count'   => $marks->func()->count('mark')
  9.     ])
  10.     ->from('user_notes_game')
  11.     ->group(['game_id'])
  12.   ], ['Games.id = GameMarks.game_id']);
  13.  
  14.   $games->autoFields(true);
  15.   $games->select([
  16.     'mark' => 'GameMarks.sum / GameMarks.count'
  17.   ]);
  18.   debug($games->sql());
  19.  
  20.   return $games;
  21. }

Je ne comprends pas pourquoi il ne fait pas l'association dans le second cas du contain).
Un debug dans le finder révèle pourtant bien 2 appels !


Cake lance l'erreur SQL suivante : Unknown column 'GameMarks.sum' in 'field list'


C'est comme s'il ne faisait pas de select(['sum' => $marks->func()->sum('mark')]); !


Je suis sûr qu'il s'agir d'une erreur toute bête. Mais je n'arrive pas à mettre la main sur ce que j'ai mal fait... J'ai vraiment besoin d'aide sur ce coup là.


Cordialement, Novax.


PS : Les associations :

Code: php

  1. Users belongsToMany Games through UserGames
  2.  
  3. Users hasMany Loans
  4.     Loans belongsTo UserGames
  5.         UserGames belongsTo Games

Hors ligne

 

#2 23-11-2015 11:24:02

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: [Cake 3] Méthode du finder avec associations imbriquées ?

Salut,
Je n'ai pas de solutions toutes faites, mais juste des idées de pistes à creuser :
je pense que tes 3 propriétés calculées "sum","count" et "mark" devraient être des propriétés dans ton entity "GameMark" ce qui te permettrait de ne pas faire le calcul dans ta requête.
Une autre piste serait l'utilisation de mapReduce dans ton finder "withMark"


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr