我试图让我的头在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