我使用嵌套集模型将分层数据(类别)存储在 mySql 数据库中。
一切正常,只有我现在需要能够向任何节点(force_to_top
)添加属性,这会将节点设置为暂时强制到其兄弟节点的顶部,而且我不能 100% 确定如何在不物理更改的情况下执行此操作lft
和rgt
价值观。
打开节点force_to_top
属性时,我不想将原始值lft
和rgt
值存储在其他位置,更改lft
和rgt
值以将节点移动到正确位置,然后在删除属性后重置它们的原始值lft
和rgt
值。force_to_top
我认为这会进一步导致严重的问题,而且这似乎是一种非常迂回的做事方式?(如果这实际上是最简单的方法,请纠正我!但我想找到另一个,最好只使用 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
,但是现在只强制到其兄弟节点的顶部要复杂得多,因为节点可能位于庞大层次结构的中心。
任何建议或正确方向的观点将不胜感激。