以前は、父と息子の無限分類が使用されていましたが、この分類構造は明確で使いやすいです。ただし、カテゴリの数が多い場合、クエリのパフォーマンスは低下します。たとえば、ナビゲーション メニューを作成するときに、特定の分類に基づいて分類ツリー (祖先) 全体をクエリしたいとします。
再帰的クエリまたは複数のクエリにより、パフォーマンスの消費が非常に大きくなります。したがって、分類されたデータの量が多い状況では、クエリの問題を軽減するために左右の値を使用することをお勧めします。
_id
/**
+------------------------------------------------ ----------
* コンストラクター
* @access public
----------------------------- ---
*/
public function __construct($left,$right,$id){
parent::__construct();
$this->_left = $left;
$this- >_right = $right;
$this->_id = $id;
}
/**
+------------------------------------------------ ----------
- 'to' s to 'sはノードを介してワードするのでとてもそうですはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはい------------------------------- --
*/
public function getNodeById($nodeId)
{
if($nodeId>0)
{
return $this->getById($nodeId);
}
else
{
throw_Exception('未知$this->_id');
return false;
}
}
/**
+------------------------------------------------ ---------
;_id
* @return $ parentNode array()
------------------*/
public function getParentNode($nodeId,$type = 0)
{
if($nodeId == 0) throw_Exception('未知$this->_id');;
$currentNode = $this->getNodeById($nodeId) );
if($currentNode)
{
$condition = " ".$this->_left.'<'.$currentNode[$this->_left].'と '.$this->_right.' >'.$currentNode[$this->_right]." ";
if($type ==1) //直属父类
{
return $this->where($condition)->order ($this->_left." DESC")->limit(1)->find();
// $sql = "SELECT * FROM ".TABLE_NAME." WHERE {$condition} ORDER BY ". $this->_left." DESC LIMIT 1";
// return mysql_query($sql) または die(mysql_error());
}
else if($type ==0)
{
return $this->where($condition)->findAll();
// $sq l = "SELECT * FROM ".TABLE_NAME." WHERE {$condition } ";
// return mysql_query($sql) または die(mysql_error());
}
}
else
{
return false;
}
}
/**
+------------------------------------------------ ----------
int ノード $this->id
---------------------------- --
*/
public function getChildCount( $ nodeid)
{
$ currentNode = $ this-&gt; getNodeByid($ nodeid); currentNode[$this->_left] -1)/2;
}
}
/**
+------------------------------------------------ ----------
* 現在のノードの下にあるすべての子ノードを取得します。 サブクラス A の右ノード = サブクラス B の左ノード - 1 の場合、A と B は同じレベルに属します
現在のノードの次のレベルのサブクラスの場合
* @return bool ------ -----------------
*/
public function getChild($nodeId,$type=0)
{
$currentNode = $this- >getNodeById($nodeId);
if($currentNode[$this->_left]-$currentNode[$this->_right] ==1)
{
return false; // このノードが左値 - 右値 = 1 の場合、その下には子ノードがありません。currentNode [$ this-&gt; _right]; 「 」 に 「 」 アウトアウトアウトアウトアウトアウトアウトアウトアウトアウト一緒にアウト一緒にアウト一緒にアウトの ' ‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐ >_left]+1)
// 現在のノード A のサブクラスの隣
; array_push($subArr); array_push //最初の子ノードは比較マークです
サブノード {o Foreach ($ Child as $ Key = & GT; $ Sub2) {
IF ($ RightVal == $ SUB2 [$ This-& GT; _Left]
{
$ rightval = $ Sub2 [$ Th TH IS ->_right]; //ループ内の現在のノードの右側のノードを比較値として使用します
return $subArr; return $sql = "親.* から __TABLE__ をノードとして、__TABLE__ を親として選択します。{$this->_left} の間でparent.{$this->_left}
ANDparent.{$this ->_right} AND node.{$this->_id} = {$nodeId} 親順 {$ this- & gt; _left} ";
// echo $SQL;
Return $this-& gt ; クエリ ($ SQL)
}
/**
+------------------------------------- -------------------------------------------------- --
* 追加 子ノードには 3 つのタイプがあります: 0: 現在のノードの下に最後の子ノードを追加します。 1: 現在のノードの下に最初の子ノードを追加します。 2: 子ノードの後に
を追加します。現在のノードの下に
コードをコピーします
コードは次のとおりです:
+--- -------------------------------------- -------- -----
*/ - Empty') ->_right];ノードは親ノードの正しい値です。 $rightNode = $leftNode +1;
; //親ノードの左の値に対して新しいノードの左の値を +1 $rightNode = $leftNode+1; ;
$leftNode = $otherNode[$this-> ;_right]+1;
$rightNode = $leftNode+1;
".$this->_right."=". $this->_right."+2 WHERE ".$this->>_right." .$ leftNode;
// $sql2 = "UPDATE ".TABLE_NAME." SET ".$this-> _left." = this->_right.">=".$leftNode,2); // に 2 を追加します新しいノードの右側の値が左側の値より大きいすべてのノードの右側の値。>_left,$this->_left.">".$leftNode,2); +2
新しいノードより大きいすべての左の値 $newData[$this->_left] = (int)$ leftNode;
$newData[$this->_right] =(int) $rightNode;
/**
+------------------------------------------------ ----------
$nodeId int $this->_id
削除予定 * @return bool
---------------------------- -------
*/
public function rmNode($nodeId,$type =1)
{
$currentNode = $this->getNodeById($nodeId);
if($type == 1) //删免包含自身の节点
{
$sql = "DELETE FROM __TABLE__ WHERE ".$this->_left.">= {$currentNode[$this->_left]} AND ".$this->_right ."<= {$currentNode[$this->_right]}";
$childCount = ($this->getChildCount($nodeId)+1)*2; //要更新的值
$sql2 = "UPDATE __TABLE__ SET ".$this->_right."=".$this->_right."-".$childCount." WHERE ".$this-> _right.">".$currentNode[$this->_right];
$sql3 = "UPDATE __TABLE__ SET ".$this->_left."=".$this->_left."-". $childCount." WHERE ".$this->_left.">".$currentNode[$this->_left];
}
else //删除当前节点下の所有节点
{
$sql =" DELETE FROM __TABLE__ WHERE ".$this->_left."> {$currentNode[$this->_left]} AND ".$this->_right."< _right]}";
$childCount = $this->getChildCount($nodeId)*2; //要更新的值
$sql2 = "UPDATE __TABLE__ SET ".$this->_right."=".$this->_right ."-".$childCount." WHERE ".$this-> _right.">=".$currentNode[$this->_right];
$sql3 = "UPDATE __TABLE__ SET ".$this->>_left."=".$this->_left."-" .$childCount." WHERE ".$this->_left.">".$currentNode[$this->_left];
}
$this->execute($sql);
$this->execute($sql2);
$this->execute($sql3);
true を返す;
}~ gt;_id]; newData[$this->_id]); }
}
?>
http://www.bkjia.com/PHPjc/327715.html
www.bkjia.com
本当
http://www.bkjia.com/PHPjc/327715.html
技術記事
以前は、父と息子の無限分類が使用されていましたが、この分類構造は明確で使いやすいです。ただし、カテゴリの数が多い場合、クエリのパフォーマンスは低下します。例えばナビゲーションメニューを作るときにroot化したいのですが…