下面是生成模型列表的库的一部分.... ->getBy()
部分只接受SQL并将其放在SQL中的WHERE
子句之后。所以它执行为:WHERE site_id = ? ORDER BY name ASC
/**
* 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;
}
最终结果如下:
阵列( 阵列( 'area'=>新区域模型()//肯塔基州的areaModel 'subareas'=>阵列( 新区域模型(),// Cincinatti的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
答案 0 :(得分:1)
与MSSQL的isnull
一样,MySQL有ifnull
。
ORDER BY IFNULL(parent_id, 0)
会将null
parent_id放在具有实际值的那些之前。