2012-12-10 7 views
2

J'ai l'impression d'avoir tout essayé et je viens maintenant à vous.CakePHP paginer et commander par

J'essaie de commander mes données mais ça ne va pas si bien, un peu nouveau pour Cake.

Voici mon code:

$this->set('threads', $this->paginate('Thread', array(
     'Thread.hidden' => 0, 
     'Thread.forum_category_id' => $id, 
     'order' => array(
      'Thread.created' => 'desc' 
     ) 
    ))); 

Il génère une erreur SQL et c'est la dernière partie et intéressante:

AND `Thread`.`forum_category_id` = 12 AND order = ('desc') ORDER BY `Thread`.`created` ASC LIMIT 25 

Comment puis-je résoudre ce problème? Le champ créé existe évidemment dans la base de données. :/

Répondre

3

Essayez

$this->set('threads', $this->paginate('Thread', array(
     'Thread.hidden' => 0, 
     'Thread.forum_category_id' => $id 
    ), 
    array(
     'Thread.created' => 'desc' 
    ) 
)); 

Je ne suis pas maître de gâteau, juste une supposition.

EDIT. Oui c'est vrai. Gâteau manual extrait:

qui contrôle les champs utilisés pour commander ... $this->paginate('Post', array(), array('title', 'slug'));

Donc ordre est le troisième argument.

+0

la requête s'exécute, mais elle ne l'ordonne pas:/ – Ms01

+0

@cubsink pouvez-vous regarder le nouveau SQL généré? –

+0

accepté votre réponse car il était correct et vous étiez le premier :) – Ms01

7

Vous devez transmettre la clé conditions lors de l'utilisation de plusieurs filtres (c'est-à-dire ordre, limite ...). Si vous juste spécifier des conditions, vous pouvez passer en second paramètre directement.

Cela devrait le faire:

$this->set('threads', $this->paginate('Thread', array(
     'conditions' => array(
      'Thread.hidden' => 0, 
      'Thread.forum_category_id' => $id 
     ), 
     'order' => array(
      'Thread.created' => 'desc' 
     ) 
    ))); 

ou peut-être un peu plus clair:

$this->paginate['order'] = array('Thread.created' => 'desc'); 
$this->paginate['conditions'] = array('Thread.hidden' => 0, ...); 
$this->paginate['limit'] = 10; 
$this->set('threads', $this->paginate()); 

si vous obtenez une erreur, ajoutez public $paginate; en haut de votre contrôleur.

+0

Je me suis juste rendu compte que paginate public était déjà placé en haut avec une instruction. Je me suis aveuglé pendant un moment. Merci. – Ms01