说明:
每个数据项都有自己的左值和右值。所有数据的左右值是连续的数字。
① 当右值比左值大1时,表示该数据无子集;
② 当某一数据项的左值大于另一数据项的左值,且该数据项的右值小于同另一数据项的右值时,该数据项属于另一数据项的子集;
例如:中国(1,8) 广东(2,5) 珠海(3,4) 江西(6,7)
数据库表结构:
CREATE TABLE `jd_category` (
`id_category` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL,
`lft` int(10) NOT NULL,
`rgt` int(10) NOT NULL,
`level` tinyint(1) NOT NULL,
`is_del` tinyint(1) NOT NULL,
PRIMARY KEY (`id_category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BTreeR 只用于实现数据读取:
'level',
'lft' => 'lft',
'rgt' => 'rgt',
);
/**
* 获取虚拟的顶级目录
*/
protected function virtualTop(){
return array(
self::$fieldMap['level'] => -1,
self::$fieldMap['lft'] => -1,
self::$fieldMap['rgt'] => ((int)$this->where($this->condition)->max('rgt') + 1),
);
return $this->obj;
}
// 设置当前对象
public function setObj( $obj ){
if( $obj[ $this->getPk() ] && isset($obj[ self::$fieldMap['lft'] ]) && isset($obj[ self::$fieldMap['rgt'] ]) && isset($obj[ self::$fieldMap['level'] ]) ){
$this->obj = $obj;
}else{
$this->obj = false;
}
return $this;
}
// 设置条件参数
public function setCondition( $condition ){
$this->condition = $condition;
return $this;
}
/**
* 是否存在父节点
*/
public function hasParent(){
if( !$this->obj[ $this->getPk() ] || !$this->obj[ self::$fieldMap['level'] ] ){
return false;
}
return true;
}
/**
* 查询父级节点
*
* @param boolean $width_self 是否包含当前节点
*/
public function parents( $width_self = false ){
if( !$this->obj[ $this->getPk() ] ){
return false;
}
$map = $this->condition;
if( $width_self ){