- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我正在尝试添加一个新的后代,但很难实现它,它显示了一些错误,如果您能花时间回顾一下我迄今为止所做的事情,我将不胜感激。 这里 Controller public function index() {
我目前正在做一个 PoC 并面临闭包表的问题。我正在使用 Saiku CE,数据库是 postgres。一切正常,直到我添加一个闭包表。如果我删除闭包表层次结构,我不会收到任何错误。如果保留它,我会收
我有一组在 SQL Server 数据库中使用的分层数据。数据存储时使用 guid 作为主键,使用 ParentGuid 作为指向对象直接父对象的外键。我最常通过 WebApi 项目中的 Entity
我是一名优秀的程序员,十分优秀!