我使用嵌套集模型存储在mySql数据库中的分层数据(类别)。
所有工作都很完美我现在需要能够向任何节点添加属性(force_to_top
),这将设置节点暂时强制到其兄弟姐妹的顶部,我不是100%肯定如何在不实际更改lft
和rgt
值的情况下执行此操作。
如果启用了节点force_to_top
属性,我不希望将原始lft
和rgt
值存储在其他位置,请更改lft
和{{1}将值移动到正确位置的值,然后在删除rgt
属性后重置其原始lft
和rgt
值。我认为这将导致更大的问题,而且它似乎是一种非常迂回的做事方式? (纠正我,如果这实际上是最简单的方法!但我想找到另一个,最好只使用sql不更新数据库中的任何值)
我想知道是否有可能以某种方式操纵sql的输出,具体取决于force_to_top
属性?
例如,如果我们有以下结构
force_to_top
具有以下lft / rgt / force_to_top值:
Cars
|
-----------------
| | |
Audi Ford VW
当我们输出'Cars'的子节点时,我们会给出:
node lft rgt force_to_top
Cars 1 8 false
Audi 2 3 false
Ford 4 5 false
VW 6 7 false
但是让我们说节点'VW'的Audi
Ford
VW
属性设置为force_to_top
,我真正需要的是'Cars'子节点的输出到现在为止:
true
正如我所提到的,我已考虑存储原始的VW
Audi
Ford
和lft
值,并在删除rgt
属性后重置它们。不这样做的好处是关闭force_to_top
属性的速度,这意味着除了实际再次将force_to_top
值设置为force_to_top
和节点之外,没有数据操作会立即回到原来的位置。并且还意味着我不需要为每个节点的原始false
和lft
值创建存储区/额外表/额外字段。
我已经考虑过在获取结果后在php中执行此操作,但对于大型数据集来说,这可能会让事情变慢。
我最初必须将rgt
个节点设置为所有内容的顶部,这非常简单,只需force_to_top
,但现在只强迫其兄弟姐妹的顶部要复杂得多,如同节点可能位于大规模层次结构的中心。
非常感谢任何建议或正确方向上的观点。
答案 0 :(得分:0)
以防万一有人在这里遇到类似的问题(非常不可能!):
最后,我找到实现此功能的唯一方法是在其parent_id
值设置为true时存储该类别的当前nearest_sibling_id
和force_to_top
。
这样我可以通过更新lft
和rgt
值将类别移到其父级的顶部,然后在删除force_to_top
时,我可以检查{{ 1}}仍然存在,并且仍然在原始nearest_sibling_id
内。如果是,请将类别移回parent_id
旁边;如果没有,只需将类别移至原始nearest_sibling_id
的底部,因为我们无法确定最初定位的位置,因为我们的parent_id
值已过期。