我試圖讓我的頭在PHP/MySQL特別是Codeigniter中使用封閉表,我正在建設的應用程序有區域,每個區域可以有一些地點,部門等插入與PHP/MySQL的封閉表
我一直在使用http://www.slideshare.net/billkarwin/models-for-hierarchical-data瞭解它是如何工作的。
而且我也一直在使用https://gist.github.com/dazld/2174233來幫助我掌握訪問數據的方法,我可以做的很好,我已經調整了方法來根據需要提取數據,這很好。
但現在我試圖插入數據,我不能得到我的頭。所以我改編自上面的腳本add方法,但我不明白,我不能讓它的工作
繼承人的範圍表
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| area_id | int(11) | NO | PRI | NULL | auto_increment |
| area_title | varchar(40) | NO | | NULL | |
| area_name | varchar(40) | NO | | NULL | |
| org_id | int(11) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
繼承人的area_hierarchy表
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ancestor | int(11) | NO | | NULL | |
| descendant | int(11) | NO | | NULL | |
| lvl | int(11) | NO | | NULL | |
+------------+---------+------+-----+---------+----------------+
繼承人的方法,我試圖用添加條目:
public function add($node_id, $target_id) {
$sql = 'SELECT ancestor, '.$node_id.', lvl+1
FROM area_hierarchy
WHERE descendant = '.$target_id.'
UNION
SELECT '.$node_id.','.$node_id.',0';
$query = 'INSERT INTO area_hierarchy (ancestor, descendant,lvl) ('.$sql.')';
$result = $this->db->query($query);
return $result;
}
那麼具體的,什麼是$ node_id和$ target_id。
什麼是lvl + 1?
所以,如果我添加一個新的頂級區域,我傳遞給這個方法的數據是什麼?
查詢也將失敗,並給出UNION
節點ID是您要添加的新節點(子),目標ID是父節點(祖先)。工會要處理自我引用,你應該始終關閉自我引用。如果我想在B下添加D,我需要選擇B的所有祖先並創建與D的關係,我還需要根據D = D的級聯爲零創建自引用。 –
在你的例子中,假設你有10個區域,1,2,3,4,5,它們有完全相同的主鍵。它們應該都存在於根級別上,你可以首先添加這些區域,然後你可以爲每個節點調用'add($ areaId)'。然後你希望6,7,8成爲3的孩子。然後你可以爲每個區域調用'add($ areaId,3)'。最後,我們希望9和10是8的孩子。我們調用'add($ areaId,8)'。如果您需要關於爲什麼您的查詢失敗或未按預期工作的幫助,則需要向我們提供錯誤和預期結果。 –
謝謝,很好的解釋。我會離開和體驗 – frobak