分类中会出现一些分类属于另一分类,也就是子分类现象,为了在页面更好的展现这层隶属关系,我们需要优化一下
在数据表blog_catagory中插入一些新数据
思路:
将之前获得的数据进行筛选,如果cate_pid为0则代表该元组为父级分类,为其他的数据说明就是对应cate_id下的子分类。
为了之后的调用方便,定义传入的参数
1、数据的处理放到Category.php模型中,只需要给控制器返回数据结果。
1 <?php 2 3 namespace App\Http\Model; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Category extends Model 8 { 9 protected $table = ‘category‘; 10 protected $primaryKey = ‘cate_id‘; 11 public $timestamps=false; 12 13 public function tree() 14 { 15 $categorys = $this->all();//获取blog_category表数据信息 16 //dd($categorys); //测试打印获得的数据 17 return $data=$this->getTree($categorys,‘cate_name‘,‘cate_id‘,‘cate_pid‘); 18 } 19 20 21 //重新整合数据,使得子分类在父级分类之后 22 public function getTree($data,$field_name,$field_id=‘id‘,$field_pid=‘pid‘,$pid=0) 23 { 24 //dd($data); 25 $result=array(); //定义一个空数组,用于接收符合条件的对象,也可以$resullt=[] 26 foreach($data as $k=>$v) 27 { 28 //print $k." value: ".$v."<br/>";//此时输出是以json格式输出 29 //var_dump($v); 查看数据类型是对象 30 //jsn_decode()函数用于对json格式的字符串进行解码,转化为php变量,assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象 31 //$v=json_decode($v,true);数组,自己的错误思想,不需要返回数组类型 32 33 if($v->$field_pid==0){ 34 //$v=json_decode($v,true); 35 //dd($v); 36 $v["_".$field_name]=$v[$field_name]; //定义一个新的字段,如果为父级分类则是源数据内容,如果是子集分类,则加上一些标识,在视图中使用新的字段输出 37 $result[]=$v;//将符合的对象压入数组中 38 39 //二次循环,判断是否有子集分类,如果有,则压入父级分类的后面 40 foreach($data as $k1=>$v1) 41 { 42 if($v1->$field_pid==$v[$field_id]){ 43 $v1["_".$field_name]="|--- ".$v1[$field_name]; 44 $result[]=$v1; 45 } 46 } 47 } 48 } 49 50 return $result; 51 } 52 }
2、修改控制器CategoryController.php,调用tree()方法
错误调用:
$data=Category::tree();用类名称调用方法,此方法必须为静态类,而tree()不是,报错如下:
正确调用(1):
$data=(new Category)->tree(); //tree()公共方法,只能是类的对象调用,实例化类对象
正确调用(2):
将tree()方法加上static属性
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用,需要修改tree()方法
public static function tree() { $categorys = Category::all();//获取blog_category表数据信息 //dd($categorys); //测试打印获得的数据 return $data=(new Category)->getTree($categorys,‘cate_name‘,‘cate_id‘,‘cate_pid‘); }
验证:
时间: 2024-10-12 20:23:36