【发布时间】:2012-10-24 13:03:36
【问题描述】:
我使用嵌套集模型将分层数据(类别)存储在 mySql 数据库中。
一切正常,只是我现在需要向任何节点 (force_to_top) 添加属性的能力,这会将节点设置为暂时强制到其兄弟节点的顶部,但我不是 100% 确定如何无需物理更改 lft 和 rgt 值即可执行此操作。
当节点force_to_top 属性打开时,我不想将原始lft 和rgt 值存储在别处,更改lft 和rgt 值以将节点移动到正确位置,然后在删除 force_to_top 属性后重置它们的原始 lft 和 rgt 值。我认为这会进一步导致严重的问题,而且这似乎是一种非常迂回的做事方式? (如果这实际上是最简单的方法,请纠正我!但我想找到另一个,最好只使用 sql 不更新数据库中的任何值)
我想知道是否可以根据force_to_top 属性以某种方式操纵 sql 的输出?
例如,如果我们有以下结构
Cars
|
-----------------
| | |
Audi Ford VW
这将具有以下 lft/rgt/force_to_top 值:
node lft rgt force_to_top
Cars 1 8 false
Audi 2 3 false
Ford 4 5 false
VW 6 7 false
当我们输出 'Cars' 的子节点时,我们会得到:
Audi
Ford
VW
但是假设节点'VW'的force_to_top属性设置为true,我真正需要的是'Cars'的子节点的输出现在是:
VW
Audi
Ford
正如我所提到的,我考虑过存储原始 lft 和 rgt 值并在删除 force_to_top 属性后重置它们。不这样做的好处是关闭force_to_top 属性的速度,这意味着除了将force_to_top 值再次设置为false 之外没有任何数据操作,并且节点将立即回退到它的原来的位置。这也意味着我不需要为每个节点的原始 lft 和 rgt 值创建存储区域/额外表/额外字段。
我也考虑过在获取结果后在 php 中执行此操作,但对于大型数据集可能真的会减慢速度。
我最初必须将 force_to_top 节点设置到所有节点的顶部,这很容易,只需 ORDER BY force_to_top, lft,但是现在只强制到其兄弟节点的顶部要复杂得多,因为节点可能是在一个庞大的层次结构的中心。
任何建议或正确方向的观点将不胜感激。
【问题讨论】:
标签: php mysql nested-sets