Disons que j'ai deux tables: cities
et countries
. Le City
modèle belongsTo
un Country
. Maintenant, quand j'affiche des listes de villes, je veux qu'elles soient classées par nom de pays et par nom de ville.Spécification du paramètre order via une table belongsTo dans CakePHP
J'ai essayé dans ma classe City
modèle:
var $order = array('Country.name' => 'asc', 'City.name' => 'asc');
L'ordre de tri fonctionne correctement pour ma page d'index, mais je reçois des erreurs dans plusieurs endroits où le modèle a été demandé de ne pas charger des modèles associés. Dois-je modifier les paramètres de la commande lorsque je change les tables chargées ou y a-t-il une façon plus intelligente de le faire?
Pour l'instant, je pense que je vais faire la définition de la commande par défaut soit City.name
et puis il suffit de le changer en Country.name
et City.name
sur la page d'index. De cette façon, il est sûr par défaut, et je ne devrais pas avoir d'erreurs inattendues.
Mise à jour: En tant que Rob suggested, vous pouvez spécifier des paramètres de commande dans les associations de modèles. Le générateur de requête les applique comme suit:
- S'il existe un champ
order
sur le modèle principal, appliquez-le en premier. - Parcourez tous les modèles associés dans l'ordre dans lequel ils apparaissent. Si l'association inclut un paramètre
order
, ajoutez-le à la fin de la liste.
Pour mettre en œuvre mon exemple, je le ferais comme ceci:
class City extends AppModel {
var $belongsTo = array(
'Country' => array(
'order' => array('Country.name' => 'asc', 'City.name' => 'asc')));
}
Une mise en garde: si vous éteignez City.recursive
, puis les villes seront non triés. Cependant, je ne récupère habituellement qu'un seul enregistrement lorsque j'ai désactivé la récursivité.
Cela fonctionne. Voir ma mise à jour dans la question pour plus de détails sur la façon dont les champs de commande interagissent les uns avec les autres. –