gpt4 book ai didi

php - 使用 PHP/MySQL 插入闭包表

转载 作者:行者123 更新时间:2023-11-29 11:16:01 25 4
gpt4 key购买 nike

我正在尝试使用 PHP/MySQL 中的闭包表(特别是 Codeigniter),对于我正在构建的具有区域的应用程序,每个区域可以有多个位置、部门等。

我一直在使用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 之后给出语法错误

最佳答案

$node_id 将是 area 表中 area_id 列的值。据推测,这是您刚刚添加到区域表中的一行。

$target_id 将是 area 表中另一行的 area_id 列的值,即您将其标识为“ parent ”,直系祖先。

lvl+1 是世代,或者层次结构中的级别...后代与其父代的“距离”有多“远”。

如果您要添加新的“顶级”区域,则可以使用 $node_id 作为 $target_id

理解这一点的最佳方法之一是查看area_hierarchy表的“当前状态”,以及添加节点时表的“最终状态”应该是什么。

如果树中只有一个顶级节点,area_id=11,area_hierarchy 表将如下所示:

 ancestor descendant lvl 
-------- ---------- ---
11 11 0

如果我们将另一行添加到区域表,area_id=22,作为area_id=11的子代(直接后代),我们需要将这两行添加到area_hierarchy:

 ancestor descendant lvl 
-------- ---------- ---
11 22 1
22 22 0

如果我们将另一行添加到区域表,area_id=333,作为area_id=22的子项,我们需要将这些行添加到area_hierarchy表中:

 ancestor descendant lvl 
-------- ---------- ---
11 333 2
22 333 1
333 333 0

请注意,我们需要添加的前两行看起来很像表中已存在的行,其中descendant=22。不同之处在于新行的后代是 333 而不是 22,并且 lvl 的值比表中已有的行多 1。

我们需要添加的第三行是对其自身的引用。就像我们将 area_id=11 作为其自身的“父级”一样。

我们从 UNION 之后的部分得到第三行。我们通过复制area_hierarchy中已有的行,用我们要添加的节点的id(333)替换后代列的值,并将lvl增加1来获得前两行。 p>

一旦您了解需要添加哪些行,以及如何通过复制/修改表中的其他行来导出它们,那么 SQL 就开始有意义了。

<小时/>

您将完成为area_id=333添加这三行,调用add函数:

 add(333,22);

如果您想将area_id=4444添加为层次结构中的新“顶层”:

 add(4444,4444);

关于php - 使用 PHP/MySQL 插入闭包表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39726156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com