Mysql
 sql >> Base de données >  >> RDS >> Mysql

Puis-je paginer une requête personnalisée sans remplacer la pagination par défaut ?

En fait, si vous POUVEZ le faire avec find, vous POUVEZ le faire avec paginate. Vous pouvez jeter un oeil ici

Mais pour être plus précis, vous pouvez ajouter les conditions/limit/fields/contain/order etc que vous utilisez dans find à la fonction paginate.

Je n'ai pas utilisé de groupe dans la pagination mais ça DEVRAIT fonctionner :D

Dans votre cas, vous aurez quelque chose comme ceci :

$this->paginate = array(
   'fields' => array(
        'Product.category_id',
        'COUNT(Product.hotel_id) as total'
    ),
   'group' => array(
        'Product.category_id HAVING COUNT(Product.hotel_id) > 1')
    )
);

$data = $this->paginate('Product');

J'espère que cela fonctionne, postez un commentaire de votre résultat, si cela ne fonctionne pas, vous devrez le remplacer, car il n'accepte pas la condition de groupe... bien que je pense que cela fonctionnera puisque la pagination est une trouvaille à la fin.

MODIFIER :

Vous pouvez essayer de faire quelque chose comme ceci :

Remplacez paginate() et paginateCount() mais avec un ajustement, glissez une condition afin que vous puissiez dire si c'est une pagination avec ou non. Quelque chose comme ça :

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()){
   //if no having conditions set return the parent paginate 
   if (empty($conditions['having'])
       return parent::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
   //if having conditions set return your override

//override code here

}

Ensuite, vous faites quelque chose de similaire dans paginateCount(), de cette façon vous avez une pagination sélective. n'oubliez pas de supprimer $conditions['having'] une fois qu'il n'est pas nécessaire ou de le mettre quelque part qui n'affecte pas votre recherche ;)