2009-09-29 6 views
0

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:

  1. S'il existe un champ order sur le modèle principal, appliquez-le en premier.
  2. 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é.

Répondre

2

Avez-vous essayé de définir la commande directement dans votre association? Je ne l'ai jamais eu besoin de le faire, donc je ne peux pas jurer qu'il fera ce que vous êtes après, mais:

class City extends AppModel { 
    $belongsTo = array(
     'Country' => array(
      'Order' => 'Country.name' 
     ) 
    ); 
} 

Vous pourriez faire quelque chose de similaire pour votre modèle Country, bien sûr.

+0

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. –

0

ce n'est pas testé, mais l'idée est dans le modèle de pays que vous pouvez faire

hasMany = array('City'); 
function beforeFind() 
{ 
    foreach($this->hasMany as $model) 
    { 
     $this->order[] = $model['className'].'.'.'ASC'; 
    } 
} 

pas la peine de faire l'OMI. Notre chemin va bien.

Questions connexes