2010-09-22 8 views
4

Je veux utiliser CakePHP pour tirer un tableau de photos à partir d'une base de données, triées par titre de la photo (0, 1, 2, 3 ...) Ma requête ressemble actuellement quelque chose comme:CakePHP Find - Commander par String-To-Int?

$ss_photos = $this->Asset->find('all',array(
    'conditions'=>array('kind'=>'photo'), 
    'order'=>'title' 
)); 

Malheureusement, les titres semblent être en format chaîne, conduisant à un ordre de tri indésirable (2.jpg après 19.jpg, etc). Existe-t-il un moyen rapide de lancer 'title' comme int pour commander à l'intérieur d'une requête Cake de ce type?

+0

N.B. ils sont $ ss_photos parce qu'ils sont destinés à être utilisés dans un diaporama, pas parce qu'ils représentent des membres nazis de "Schutzstaffel". Parfois, il est important de clarifier ces choses. – thesunneversets

+0

Vous pouvez utiliser ['CAST()'] (http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast) ou 'CONVERT()' – NullUserException

+0

ORDER BY CAST (titre AS INT) ou similaire fonctionnerait probablement en MySQL, réfléchissant juste à la meilleure façon de l'intégrer dans une requête CakePHP! – thesunneversets

Répondre

2

Je ne sais pas si cela est « pratique recommandée », mais sur une première passe, il semble fonctionner:

$ss_photos = $this->Asset->find('all',array(
    'conditions'=>array('kind'=>'photo'), 
    'order'=>'Asset.title + 0' 
)); 

Les opinions?

+0

Merci, ça a bien marché. – 472084

+0

'order' => 'CAST (titre AS INT)' fonctionne aussi bien, MAIS (je viens de le découvrir après avoir déployé le code) uniquement avec MySQL 5.6 ou équivalent. Utiliser CAST AS SIGNED sur les anciennes versions – savedario

0

La solution est de créer une colonne cachée qui est responsable des commandes dans votre exemple. Les noms d'image doivent être: 00002.jpg, 00019.jpg - de cette façon, la commande fonctionnera correctement.

Si les résultats ne sont pas trop nombreux, je pense qu'il est plus facile de les trier en PHP (si vous les utilisez bien sûr :)) Voir juste natsort() il suffit d'extraire une liste d'images et de les trier.

+0

Le tri en PHP pourrait en effet être la solution la moins gourmande en efforts, si Cake va avoir du mal à refaire le type lors de ma requête ... – thesunneversets