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 相关文章推荐
dedecms中显示数字验证码的修改方法
Mar 21 PHP
php实现的在线人员函数库
Apr 09 PHP
php 购物车实例(申精)
May 11 PHP
8个PHP程序员常用的功能汇总
Dec 18 PHP
php删除文本文件中重复行的方法
Apr 28 PHP
php实现遍历多维数组的方法
Nov 25 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
Sep 07 PHP
PHP如何通过表单直接提交大文件详解
Jan 08 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
关于PHP求解三数之和问题详析
Nov 09 PHP
PHP使用QR Code生成二维码实例
Jul 07 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
博士208HAF收音机实习报告
2021/03/02 无线电
PHP 的 __FILE__ 常量
2007/01/15 PHP
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
JavaScript实用技巧(一)
2010/08/16 Javascript
document.createElement()用法
2013/03/13 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python获取交互式ssh shell的方法
2019/02/14 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
高一家长会邀请函
2014/01/12 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
《春晓》教学反思
2014/04/20 职场文书
租房协议书范文
2014/08/20 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏