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 相关文章推荐
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
PHP生成随机数的方法实例分析
Jan 22 PHP
php compact 通过变量创建数组
Nov 15 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
php利用ZipArchive类操作文件的实例
Jan 21 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工厂模式的好处
2013/06/18 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
php读取本地json文件的实例
2018/03/07 PHP
YII框架关联查询操作示例
2019/04/29 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Python操作MongoDB详解及实例
2017/05/18 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
P/Invoke是什么
2015/07/31 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
青年文明号事迹材料
2014/01/18 职场文书
护士求职信
2014/07/05 职场文书
井冈山红色之旅感想
2014/10/07 职场文书