J'ai une base de données d'emplacements, l'utilisateur peut choisir parmi en tapant et saisie semi-automatique. Dans mon contrôleur CakePHP, je fais ceci:commande personnalisée CakePHP par clause pour jQuery autocomplete
$locations = $this->Location->find('all', array(
'conditions' => array('Location.name like' => '%'.$term.'%'),
'fields' => array('Location.id', 'Location.name', 'Region.name'),
'order' => array(
array('Location.name = "'.mysql_real_escape_string($term).'"'
=> 'desc'),
'Location.name'
),
'limit' => 10,
'recursive' => 1,
));
Il fonctionne parfaitement bien, mais il se sent comme un hack, et je préfère ne pas échapper à moi-même littéraux SQL.
La première commande par clause est nécessaire car un match parfait pourrait par ailleurs pas le faire en haut de la liste triée par ordre alphabétique.
Je considère déplacer l'égalité-test dans un champ virtuel, mais je ne pense pas que c'est une solution très élégante lorsque le terme de $ est dynamique.
Comment est-ce que je peux implémenter ceci d'une meilleure manière?
Cela semble bien pour moi. Pensez à la façon dont vous l'écrivez si vous deviez écrire la version SQL, alors vous aurez une idée de son élégance. Si cela fonctionne, laissez-le. – Leo
Est-ce que Cake n'échappe pas automatiquement à TOUS les sql? J'aurais deviné que cela échapperait à votre ordre par clause ainsi que tout le reste. –
En fait, je me suis rendu compte que ce n'est pas un moteur de recherche, mais une simple complétion automatique, donc la solution * real * consiste à chercher un nom * commençant * avec le terme ($ term. '%'). Ensuite, l'ordre par correspondance exacte n'est plus nécessaire. – geon