2011-11-23 161 views
0

下面是生成模型列表的庫的一部分.... ->getBy()部分僅取SQL並將其放在SQL中的WHERE子句之後。因此,它會爲執行:WHERE site_id = ? ORDER BY name ASCSQL結果中的優先級排序

/** 
* 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; 
} 

最終的結果是一個數組,如:

陣列( 陣列( '區域'=>新areaModel()// areaModel爲肯塔基 「子區域'=>數組( 新areaModel(),// areaModel爲辛辛那提 新areaModel(),// areaModel路易斯維爾 新areaModel()// areaModel爲列剋星敦 ) ) )

這個設置的問題是,原來的ORDER BY將俄亥俄州放在我的嵌套區域的頂部,因爲它的子區域Akron/Canton首先由ORDER BY顯示。就像這樣:

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

是否可以簡單地調整我的查詢由那些parent_id IS NULL那些對parent_id

回答

1

像MSSQL的isnull一個整數值之前,正確排序結果,MySQL有ifnull

ORDER BY IFNULL(parent_id, 0) 

將把null PARENT_ID的那些與實際值之前。

+0

太棒了!那很完美 – Webnet