CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 25-10-2015 14:57:55

shingo
Fraisier
Date d'inscription: 04-03-2014
Messages: 54

CakePHP3 et le polymorphic

Bonjour, cela fait quelques jours que je penche sur le polymorphic dans CakePHP3. Dans mon cas, j'ai la table feeds qui peut être associée vers plusieurs autres tables. Cette table enregistre toutes les activités des membres à la manière d'un réseau social façon Facebook. J'ai donc crée deux champs "model" et "foreign_key" afin de définir des conditions pour chaque association.

Jusque là pas de problèmes, mais j'ai remarqué que lorsque je souhaitais récupérer des associations en profondeurs, le résultat de ma requête était vide. Normal, puisque certaines associations sont définie à INNER comme ici :

Code: php

  1. /* FeedsTable */
  2. $this->belongsTo('Questions', [
  3.             'foreignKey' => 'foreign_key',
  4.             'conditions' => ['Feeds.model' => 'Questions'],
  5.         ]);

Code: php

  1. /* QuestionsTable */
  2.  
  3. $this->belongsTo('Categories',[
  4.             'className' => 'QuestionCategories',
  5.             'foreignKey' => 'question_category_id',
  6.             'joinType' => 'INNER'
  7.         ]);

Code: php

  1. $feeds = $this->Feeds->find();
  2. $feeds->contain([
  3.       'Users.Profiles.Avatars',
  4.       'Questions.Categories',
  5.       'Statuses',
  6.       /* etc. */
  7. ]);
  8. $feeds->where(['Users.username' => $this->request->data['username']])->order(['Feeds.created' => 'DESC']);

Forcément j'obtiens aucun résultat sauf si dans ma requête on récupère des questions.

J'ai cherché un peu partout et la seule solution que j'ai trouvé est de passer par formatResults() :

Code: php

  1. public function beforeFind(Event $event, Query $query) {
  2.        
  3.         $query->formatResults(function($results){
  4.             return $results->map(function ($row) {
  5.                
  6.                 $table = \Cake\ORM\TableRegistry::get($row['model']);
  7.                 if($table) {
  8.                     $options = array();
  9.                     if($row['model'] === 'Questions') {
  10.                         $options['contain'][] = 'Categories';
  11.                     }
  12.                    
  13.                     if($table->association('comments')) {
  14.                         $options['contain']['Comments'] = function($q) {
  15.                             return $q
  16.                                     ->find('threaded')
  17.                                     ->contain(['Users.Profiles.Avatars'])
  18.                                     ->order(['Comments.created' => 'ASC']);
  19.                         };
  20.                     }
  21.                    
  22.                     $row['object'] = $table->get($row['foreign_key'], $options);
  23.                    
  24.                     return $row;
  25.                 }
  26.                
  27.                 return false;
  28.                        
  29.             });
  30.         });
  31.        
  32.         return $query;
  33.        
  34.     }

Bien que cela fonctionne, je n'aime pas trop cette façon de faire. Je voulais savoir s'il n'existait pas une autre méthode plus propre que de faire du polymorphic avec CakePHP.

Merci !

Dernière modification par shingo (25-10-2015 15:13:43)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr