2011-11-23 5 views
0

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 ASCPriorité 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

Répondre

1

Comme MSSQL isnull de, MySQL a ifnull.

ORDER BY IFNULL(parent_id, 0) 

placera null PARENT_ID avant de ceux qui ont une valeur réelle.

+0

Génial! C'est parfait – Webnet