Ci-dessous une partie d'une bibliothèque qui génère des listes de modèles .... la partie ->getBy()
prend simplement le SQL et le place après une clause WHERE
dans SQL. Donc, ce serait exécuter comme: WHERE site_id = ? ORDER BY name ASC
Priorité de tri dans les résultats SQL
/**
* Get areas
*/
public function getAreas() {
return $this->modelFactory('area')->getBy('site_id = ? ORDER BY name ASC', array($this->siteId));
}
/**
* Get nested areas
*/
public function getNestedAreas() {
$nestedAreas = array();
$areas = $this->getAreas();
if (is_array($areas)) {
foreach ($areas as $area) {
//parent areas
if ($area->getParentId() == NULL) {
$nestedAreas[$area->getId()]['area'] = $area;
} else {
$nestedAreas[$area->getParentId()]['subareas'][] = $area;
}
}
$areas = $nestedAreas;
} else {
$areas = array();
}
return $areas;
}
Le résultat final est un tableau comme:
tableau( array ( 'zone' => new areaModel() // areaModel pour les sous-zones « Kentucky '=> array ( nouveau areaModel(), // areaModel pour Cincinatti nouveau areaModel(), // areaModel pour Louisville nouveau areaModel() // areaModel pour Lexington ) ) )
Le problème avec cette configuration est que l'original ORDER BY
mettra l'Ohio au sommet de mes zones imbriquées, car sa sous-zone Akron/Canton
apparaît d'abord par le ORDER BY
. Comme ceci:
<select name='area_id'>
<optgroup label='Ohio'>
<option value='905'>Akron/Canton</option>
<option value='1154'>Cincinnati</option>
<option value='1155'>Cleveland Eastside</option>
<option value='908'>Cleveland Westside</option>
<option value='910'>Dayton</option>
<option value='1394'>Toledo</option>
</optgroup>
<optgroup label='Alabama'>
<option value='988'>Birmingham, AL</option>
<option value='1224'>Huntsville</option>
<option value='712'>Mobile/Baldwin County</option>
....
Est-il possible d'ajuster simplement ma requête pour commander correctement les résultats par ceux qui ont parent_id IS NULL
avant ceux qui ont une valeur entière pour parent_id
Génial! C'est parfait – Webnet