问题:在分类显示时需要将同一上级类的子类在下方显示,方便管理、修改;理想模样如图:
想法:在数据库取出数据后,对得到的数组重新进行排序,放进一个新的数组内,然后将新新的数组输出模板。
实施:定义空数组,遍历数据库数组放到新的数组内,
public function index(){ $category = Category::all();
$arr = [];
foreach ($category as $k => $v) {
if($v->pid == 0){ #首先判断父级类
$arr[] = $data[$k]; #父级类存入数组
foreach($data as $k1=>$v1){ #遍历子类
if($v1->pid == $v->$field_id){ #判断下一级别的子类
$arr[] =$data[$k1]; #子类存入数组
}
}
}
}
return view('admin.category.index')->with('data',$arr); }
优化:将方法提取出来放在model中,使用时只需要调用方法便可以达到目的:
①在什么时候都可以使用,减少代码冗余。②遵循丰富的model,简单的控制器原则
public function tree(){
$category = (new Category)->all();
return $this->getTree($category,'cate_name','cate_id','cate_pid');
}
public function getTree($data,$field_name,$field_id="id",$field_pid="pid",$pid=0){ $arr = []; foreach ($data as $k => $v) { if($v->$field_pid == $pid){ $v['_cate_name'] = $v[$field_name]; $arr[] = $data[$k]; foreach($data as $k1=>$v1){ if($v1->$field_pid == $v->$field_id){ $v1['_cate_name'] = '|----'.$v1[$field_name]; $arr[] =$data[$k1]; } } } } return $arr; }
通过此方法达到了单一责任原则,在使用是只需要调用tree方法即可。
public function index(){ $category = (new Category)-> tree(); return view('admin.category.index')->with('data',$category); }
补充:可以将tree()改为静态方法,调用时不需要实例化
public static function tree(){ $category = Category::orderBy('cate_order')->get(); return (new Category)->getTree($category,'cate_name','cate_id','cate_pid'); }
调用仍然使用tree方法
public function index(){ $category = Category::tree(); return view('admin.category.index')->with('data',$category); }
总结:1、分类级别显示只需要对数组再次排序
2、尽量减少控制器代码,写入到model中