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之第四天
Oct 09 PHP
PHP4.04简明安装
Oct 09 PHP
MySQL数据源表结构图示
Jun 05 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
thinkphp循环结构用法实例
Nov 24 PHP
PHP生成plist数据的方法
Jun 16 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
win10环境PHP 7 安装配置【教程】
May 09 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
Laravel 批量更新多条数据的示例
Nov 27 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异步调用socket实现代码
2012/01/12 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python进度条的制作代码实例
2019/08/31 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
专科应届生求职信
2013/11/24 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
租房合同协议书
2014/04/09 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
森林防火标语
2014/06/23 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技