无限分类

分享 未结 置顶
2 324
playboy
playboy VIP 1 2018-08-22
悬赏:0

作为 Z-PHP 的扩展类,封装了增删改查和统计,方便扩展数据表,可用于栏目分类及成员从属分类

需要框架3.0版本

需要的同学请移步 码云 下载


/**
 * 如果同时删除多个分类,多个分类之间不可存在从属关系
 * 上级分类不能变更到自己的下级下面
 * 实际应用中,应该缓存查询结果。
 * 当数据量很大时,应尽量避免子分类很多的父分类修改pid和删除,可能会造成服务器长时间没有响应。
 * 数据表:
 	主副表的存储引擎必须 InnoDB
 	主表名自定义,在实例化时传入即可(主表字段可扩展)
 	副表的表名命名格式:(主表表名_sub)禁止修改副表结构
 	其它关联表可自行设计(关联字段:cid)关联表的增删改需要自行操作
 *
 * 主表结构:
	DROP TABLE IF EXISTS `col_cat`;
	CREATE TABLE `col_cat`(
	`cid` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`pid` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级',
	`sort` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序',
	`deep` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '深度',
	`title` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '标题',
	`pids` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '上级的路径',
	`allow` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否允许子分类',
	INDEX col_cat(`pid`,`sort`,`deep`)
	)ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 * 副表结构:
	DROP TABLE IF EXISTS `col_cat_sub`;
	CREATE TABLE `col_cat_sub`(
	`cid` INT UNSIGNED NOT NULL DEFAULT 0,
	`subid` INT UNSIGNED NOT NULL DEFAULT 0,
	`cdeep` TINYINT UNSIGNED NOT NULL DEFAULT 0,
	`sdeep` TINYINT UNSIGNED NOT NULL DEFAULT 0,
	PRIMARY KEY (`cid`,`subid`),
	INDEX col_cat_sub(`cdeep`,`sdeep`)
	)ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 *
 * 以下表名均不带前缀!
 * 初始化:
	$cat = new \ext\category('cat'); //参数cat是主表的表名(不带前缀)
 * 可将数据库配置做为第二个参数传入,详见文档-数据模型-基本操作-数据库连接配置
 *
 * 获取错误信息:
 	$cat->error();
 *
 * 新增分类:
	$newCat = ['title'=>'分类一','pid'=>0,'sort'=>0,...更多字段];
	$cat->addCat($newCat); //返回新增分类
 *
 * 修改分类:
	$editCat = ['cid'=>1,title'=>'分类一','pid'=>0,'sort'=>0,...更多字段];
	$cat->setCat($editCat); //返回修改后的分类(cid字段必须)
 *
 * 删除分类:
	$cat->delCat(1,false) //删除cid是1的分类(第一个参数cid可以是数组,第二个参数是否删除其下的子分类)
	返回所删除分类的cid(数组)
 * 
 * 查询:
	$config = [
		'pid'=>0, //查询某个cid下的子分类 默认0
		'deep'=>0, //查询结果包含多少级子分类 默认0
		'order'=>'a.deep,cat_info.point DESC', //排序 格式:(表名.字段名 排序方式)多数情况下a.deep应该作为第一个排序,默认(a.deep,a.sort)
		'join'=>['cat_info'=>['title AS subtitle','name AS subname']], //关联表查询 格式:([表名1,表名2,表名3...])或者([表名1=>[字段1 AS 别名1,字段2,字段3...]])
		'assoc'=>false //是否按层次关系返回
	];
	$list = $cat->get($config);
 *
 * 统计:
 	$cid = [1,2]; //要统计的分类id,为数组时表示分别统计各分类
 	$cid = '1,2'; //为字符串时表示合并统计各分类
        $field = '*,userpoint.point'; //要统计的字段,格式:(表名.字段名),统计主表字段时可省略表名只写字段名,多个字段用","分隔,*表示统计行数
	$cat->sumCat($cid,$field,true); //第三个参数表示统计其下的子分类
 */



回帖