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 相关文章推荐
新浪新闻小偷
Oct 09 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
用PHP查询搜索引擎排名位置的代码
Jan 05 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
php实现分页工具类分享
Jan 09 PHP
php实现的树形结构数据存取类实例
Nov 29 PHP
php实现统计网站在线人数的方法
May 12 PHP
php session 写入数据库
Feb 13 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 PHP
Yii2实现ajax上传图片插件用法
Apr 28 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
Laravel中服务提供者和门面模式的入门介绍
Nov 06 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上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python里dict变成list实例方法
2019/06/26 Python
python中time库的实例使用方法
2019/10/31 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
物业电工岗位职责
2013/11/20 职场文书
毕业生的自我评价分享
2013/12/18 职场文书
农民致富事迹材料
2014/01/23 职场文书
会计专业自我评价
2014/02/12 职场文书
读书演讲主持词
2014/03/18 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
植物园观后感
2015/06/11 职场文书
预备党员表决心的话
2015/09/22 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
python实现图片批量压缩
2021/04/24 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
讨论nginx location 顺序问题
2022/05/30 Servers