2017-10-09 2 views
0

Comme je peux dans cakephp 3.x je peux trier les résultats par une ligne qui a un nombre, parce que je ne vois pas la forme, quelque chose de très similaire dans CakePHP 2.x fonctionne sans problème. Que manque-t-il pour pouvoir faire de même dans CakePHP 3.x ..? Mon test est en CakePHP v3.3.10 en PHP 7.1 WAMPTri de la pagination par, ligne Alias ​​Compte par exemple dans CakePHP 3.x, données en liant une table de jointure

Tout le genre de travaux correctement, sauf pagination des finales count_users, quand je clique ne donne pas une erreur, il suffit de ne pas trier les données.

HTML ctp

<?= $this->Paginator->sort('count_users',_('N° Users')); ?> 

contrôleur

$this->Licensees->schema() 
     ->addColumn('count_users', [ 
      'type' => 'integer', 
     ]); 
    $this->Licensees->aliasField('count_users'); 

    $where = [ 
     'recursive'=>-1, 
     'fields' => [ 
      'Licensees.id', 
      'Licensees.name', 
      'Licensees.created', 
      'Licensees.modified', 
      'Licensees__count_users' => 'count(LicenseesUsers.licensees_id)', 
      // 'count_users' => 'count(LicenseesUsers.licensees_id)', 
      // 'Licensees.count_users' => 'count(LicenseesUsers.licensees_id)', 
     ], 
     'sortWhitelist' => ['name','count_users','created','modified'], 
     'join' => [ 
      'LicenseesUsers' => [ 
       'table' => 'licensees_users', 
       'type' => 'LEFT', 
       'conditions' => [ 
        'LicenseesUsers.licensees_id = Licensees.id' 
       ], 
      ], 
     ], 
     'group' => 'Licensees.id' 
    ]; 

    // Set pagination 
    $this->paginate = $where; 

    // Get data 
    $licensees = $this->paginate($this->Licensees); 

Afficher erreur champ Trier paginations count_users

object(Cake\ORM\Query) { 

    '(help)' => 'This is a Query object, to get the results execute or iterate it.', 
    'sql' => 'SELECT Licensees.id AS `Licensees__id`, Licensees.name AS `Licensees__name`, Licensees.created AS `Licensees__created`, Licensees.modified AS `Licensees__modified`, count(LicenseesUsers.licensees_id) AS `Licensees__count_users`, count(LicenseesUsers.licensees_id) AS `count_users` FROM licensees Licensees LEFT JOIN licensees_users LicenseesUsers ON LicenseesUsers.licensees_id = Licensees.id LEFT JOIN users Users ON Users.id = LicenseesUsers.users_id GROUP BY Licensees.id ORDER BY Licensees.count_users asc LIMIT 50 OFFSET 0', 
    'params' => [], 
    'defaultTypes' => [ 
     'Licensees__id' => 'uuid', 
     'Licensees.id' => 'uuid', 
     'id' => 'uuid', 
     'Licensees__name' => 'string', 
     'Licensees.name' => 'string', 
     'name' => 'string', 
     'Licensees__active' => 'boolean', 
     'Licensees.active' => 'boolean', 
     'active' => 'boolean', 
     'Licensees__deleted_at' => 'datetime', 
     'Licensees.deleted_at' => 'datetime', 
     'deleted_at' => 'datetime', 
     'Licensees__created' => 'datetime', 
     'Licensees.created' => 'datetime', 
     'created' => 'datetime', 
     'Licensees__modified' => 'datetime', 
     'Licensees.modified' => 'datetime', 
     'modified' => 'datetime', 
     'Licensees__count_users' => 'integer', 
     'Licensees.count_users' => 'integer', 
     'count_users' => 'integer' 
    ], 
    'decorators' => (int) 0, 
    'executed' => false, 
    'hydrate' => true, 
    'buffered' => true, 
    'formatters' => (int) 0, 
    'mapReducers' => (int) 0, 
    'contain' => [], 
    'matching' => [], 
    'extraOptions' => [ 
     'recursive' => (int) -1, 
     'scope' => null, 
     'sortWhitelist' => [ 
      (int) 0 => 'name', 
      (int) 1 => 'count_users', 
      (int) 2 => 'created', 
      (int) 3 => 'modified' 
     ], 
     'whitelist' => [ 
      (int) 0 => 'limit', 
      (int) 1 => 'sort', 
      (int) 2 => 'page', 
      (int) 3 => 'direction' 
     ] 
    ], 
    'repository' => object(App\Model\Table\LicenseesTable) { 

     'registryAlias' => 'Licensees', 
     'table' => 'licensees', 
     'alias' => 'Licensees', 
     'entityClass' => 'App\Model\Entity\Licensee', 
     'associations' => [ 
      [maximum depth reached] 
     ], 
     'behaviors' => [ 
      [maximum depth reached] 
     ], 
     'defaultConnection' => 'default', 
     'connectionName' => 'default' 

    } 

} 
+0

Je pense que vous avez juste à utiliser '' count_users' au lieu de Licensees__count_users', de cette façon: ' 'count_users' => 'count (LicenseesUsers.licensees_id)'' – arilia

+0

Salut Arilia, ce n'est pas valide de cette façon, j'ai déjà essayé tout le chemin qu'ils sont commentés et ne commande pas par cette colonne. Je l'ajoute également en tant que virtualProperties dans l'identité, mais cela ne fonctionne pas non plus. Je ne sais pas quoi faire d'autre. Et il doit être en mesure de ** SORT ** par ** count_users ** – Sergio

+0

Il est valide, mais vous avez fait une erreur supplémentaire, et vous devriez recevoir une erreur, que vous devriez toujours mentionner (et poster y compris la stracktrace correspondante et votre version exacte de CakePHP!), car cela aide grandement à résoudre les problèmes! – ndm

Répondre

1

Comme mentionné dans les commentaires, vous devez utiliser la variante count_users, c'est-à-dire sans aucun alias, cela fonctionnera généralement très bien. Les choses vont casser pour vous parce que vous avez fait de la colonne count_users une partie de votre schéma ($this->Licensees->schema()->addColumn()), ce qui fera que CakePHP la traitera comme une vraie colonne, et donc alias intérieurement le nom de la colonne, ce qui causera la clause ORDER BY pour utiliser Licensees.count_users, qui ne fonctionnera pas car aucune colonne de ce type n'existe (vous ne pouvez pas ajouter une colonne calculée à un alias existant). Si vous souhaitez que la colonne calculée soit traitée comme un type spécifique, modifiez la mappe de type (select) à la place, soit en créant et en paginant un objet de requête approprié, soit en modifiant la requête à la volée, par exemple: finder, ou via l'événement Model.beforeFind.

// use getSelectTypeMap() as of CakePHP 3.4 
$query->selectTypeMap()->addDefaults([ 
    'count_users' => 'integer' 
]); 

Voir aussi

0

Merci NDM, il est ce que vous avez dit.

Le problème sera commenté les lignes suivantes.

Controller:

// $this->Licensees->schema() 
//   ->addColumn('count_users', [ 
//    'type' => 'integer', 
//   ]); 
//  $this->Licensees->aliasField('count_users'); 

$where = [ 
     'recursive'=>-1, 
     'fields' => [ 
      'Licensees.id', 
      'Licensees.name', 
      'Licensees.created', 
      'Licensees.modified', 
//   'Licensees__count_users' => 'count(LicenseesUsers.licensees_id)', 
      'count_users' => 'count(LicenseesUsers.licensees_id)', 
     ], 
     'sortWhitelist' => ['name','count_users','created','modified'], 
     'join' => [ 
      'LicenseesUsers' => [ 
       'table' => 'licensees_users', 
       'type' => 'LEFT', 
       'conditions' => [ 
        'LicenseesUsers.licensees_id = Licensees.id' 
       ], 
      ], 
     ], 
     'group' => 'Licensees.id' 
    ]; 

    // Set pagination 
    $this->paginate = $where; 

    // Get data 
    $licensees = $this->paginate($this->Licensees);