thinkphp5实现无限级分类


Posted in PHP onFebruary 18, 2019

tp5对分类数据表的信息读取与展示,我们即可以控制器完成,也可以在对应的模型中完成。本案例,我们在模型中完全成。况且,对数据表的增,删改查操作,本来就是模型的本职工作。

首先声明一下,我们采用递归的方式来实现无限分类。但无限分类的实现,不是只是递归一种方式,还有一种是全路径方式,也可以实现,不过,这种方式通常用在全路径导航菜单中。所以,这里我们还是用最常见的递归函数来实现:无限分类。

首先我们先创建一个静态方法:getCate,为什么要静态方式,因为静态方法执行效率高,不需要实例化,而且,分类查询是使用非常频繁的操作,很多查询都要依赖分类查询的结果。

当前的getCate方法,有三个参数:

第一个是$pid,是父类的id,默认为0,表示从顶级开始查起。

第二个参数是返回的查询结果,我们放在一个数组中返回,注意,这个变量是引入方式传入的。

在递归函数中,返回结果有三种方式:

第一种就是大家比较熟悉的,使用全局变量$_GLOBALS[],这个方法有副作用,我们不用它;

第二种方式也不错,是在函数中用static关键字,声明一个静态变量,它可以将每一次的递归执行结果进行累计,最后再返回,非常好理解,但占用资源过多,执行效率低;

第三种,就是采用引用参数的方式,来返回结果,这也是目前主流的技术。尽管理解起来有难度,但执行效率是最高的,我们要玩,就玩大的,所以这里,我们就直接采用引用,来返回查询结果。

第三个参数,可以没有,它是用来设置一下分类之间的层次显示的,可以让结果看上去更直观清晰。

<?php
 
namespace app\admin\model;
 
use think\Collection;
use think\Model;
 
class Category extends Model
{
 //创建一个静态方法getCate,来获取分类信息
 
 /**
  * @param int $pid: 当前分类的父id
  * @param array $result:引用返回值
  * @param int $blank:设置分类之间的显示提示
  */
 public static function getCate($pid=0, &$result=[], $blank=0)
 {
  //1.分类表查询:$pid
  $res = self::all(['pid'=>$pid]);
 
  //2.自定义分类名称前面的提示信息
  $blank += 2;
 
  //3.遍历分类表
  foreach ($res as $key => $value) {
 
   //3-1自定义分类名称的显示格式
   $cate_name = '|--'.$value->cate_name;
   $value->cate_name = str_repeat(' ',$blank).$cate_name;
 
   //3-2将查询到的当前记录保存到结果$result中
   $result[] = $value;
 
   //3-3关键:将当前记录的id,做为下一级分类的父id,$pid,继续递归调用本方法
   self::getCate($value->id, $result, $blank);
  }
 
  //4.返回查询结果,调用结果集类make方法打包当前结果,转为二维数组返回
  return Collection::make($result)->toArray();
 }
}

控制器中调用代码:

public function edit(Request $request)
{
 //1.获取一下分类id
 $cate_id = $request -> param('id');
 
 //2.查询要更新的数据
 $cate_now = CategoryModel::get($cate_id);
 
 //3.递归查询所有的分类信息
 $cate_level = CategoryModel::getCate();
 
 //4.模板赋值
 $this -> view -> assign('cate_now', $cate_now);
 $this -> view -> assign('cate_level', $cate_level);
 
 
 //5.渲染模板
 return $this -> view -> fetch('category_edit');
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
PHP return语句的另一个作用
Jul 30 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
使用php转义输出HTML到JavaScript
Mar 27 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
php实现文章评论系统
Feb 18 #PHP
php无限级分类实现评论及回复功能
Feb 18 #PHP
PHP-FPM 的管理和配置详解
Feb 17 #PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
PHP封装的mysqli数据库操作类示例
Feb 16 #PHP
PHP fprintf()函数用法讲解
Feb 16 #PHP
You might like
php的一些小问题
2010/07/03 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
python学习之编写查询ip程序
2016/02/27 Python
Python+微信接口实现运维报警
2016/08/27 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
创新型城市实施方案
2014/03/06 职场文书
2015大学生求职信范文
2015/03/20 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
任长霞观后感
2015/06/16 职场文书
水浒传读书笔记
2015/06/25 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
高三生物教学反思
2016/02/22 职场文书
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript