作为 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); //第三个参数表示统计其下的子分类
*/