Bonjour, Apres pas mal de temps de recherche, je ne parviens pas a régler mon problème... Je dois récupérer de ma DB une liste de moteurs de voitures dans un ordre "naturel" J'entends par la, ne pas me sortir les 110chevaux avant les 90chv.. L'ordre alphabétique me donne naturellement 110 120 90** ... Mais bien, 90 110 120 ** ... Les résultats sont sous la forme : 1.4 HDi - 68 cvx mais peuvent changer en fonction des "appellations constructeurs"... Voila, Si quelqu'un peut me sauver... ;-) Merci beaucoup

5 réponses


Govan06
Réponse acceptée

Oui en effet après réflexion c'est pas la bonne méthode. A mon avis il faut laisser tomber SQL et le faire en php. Avec Laravel c'est assez facile je pense

Imaginons ton Model s'appelle 'Motor' et le champ que tu veux ordonner 'type'

Tu peux faire dans le controller par exemple

$motors = Motor::all();
 $motors = $motors->sortBy(function ($motor)
 {
     $match = preg_replace("/^.*-{1}/i", '', $motor->type);
     return (int) $match;
 });

Le regexp dans le preg_replace c'est n'importe quel caractère répété plusieurs fois suivis du caractère '-' au moins 1 fois, le tout insensible à la casse.
Donc 1.8 TURBO - 180 devient '180'. Après tu fais un type casting pour convertir la chaine '180' en entier 180;

Si tu fais un dd($motors) ta collection devrait être ordonnée dans le sens que tu veux. Si tu veux l'autre sens, tu peux utiliser sortByDesc au lieu de sortBy .

Tiens moi au courant :-)

Salut,
En espérant avoir bien tout compris,
J'imagine que tu n'as pas la main sur la BDD, sinon je t'aurais dit de rajouter un champs 'cvx' par exemple, du coup c'est beaucoup plus facile :p
Quels sont les réultats possibles en variation ?
Est ce que tu as un caractère récurrent dans les résultats ? Ici en l’occurrence, je vois le tiret '-' dans 1.4 HDi - 68 cvx.
Si c'est le cas ex.
1.8D - 50 cvx,
2.0TFSi - 140,
1.4Hdi - 60 cvx,
1.4Tdi - 70 horses

Tu pourrais essayer un truc du genre :

SELECT * FROM table ORDER BY LPAD(REPLACE(table.colonne, '*-', ''),10 ,'0') ASC

Avec Laravel quelque chose comme ça (pas testé je suis pas sûr)

DB::select( DB::raw("SELECT * FROM table ORDER BY LPAD(REPLACE(table.colonne, '*-', ''),10 ,'0') ASC ) );
ifabe
Auteur

Salut :-) Merci Govan06. En gros, le système marche pas mal, sauf pour quelques cas, ou, dans cet exemple il me retourne ça -> 1.8 20V - 125 **1.8 TURBO - 180** **1.8 TURBO - 150** 1.9 TDi - 90 1.9 TDi - 110** Les noms sont formatés de la même façon, j'avoue ne pas comprendre pourquoi le résultat n'est pas valable dans ce cas... J'ai regardé si possible de mettre un regex pour le texte a remplacer histoire qu'il ne prenne que la fin de la chaine qui est toujours formatée " - [0-9]+" mais, je n'y arrives pas... Si tu as une idée qui peut conclure cette avancée.. Merci :-)

ifabe
Auteur

Hello ;-)

Merci beaucoup ;-)

En me basant sur ton idée (tres bonne) une petite adaptation ou deux et ca tourne nickel :-)
Encore merci

ifabe
Auteur

Tiens, étonnant..
Ca marche nickel toujours mais quand je passe mon tableau trié en Ajax, il est affiché avec l'ancien tri...
Laravel aurait il envie de m'ennuyer ?