【问题标题】:CakePHP Tree behavior -find specyfic level elementsCakePHP 树行为 - 查找特定关卡元素
【发布时间】:2014-02-09 20:42:53
【问题描述】:

我只是想知道如何使用 TreeBehavior 从模型中获取特定关卡元素。

对于第一级元素非常简单.. 只需找到具有 parent_id =>null 的元素,但对于更深层次...?

有没有什么干净简单的方法可以做到这一点?

【问题讨论】:

  • 您知道要访问的元素的父级吗?您应该可以使用parent_id => 7(或任何父元素的 id)访问它们。
  • 不,我没有。我只想显示(例如)所有二级元素,我不知道 db 中存在多少一级元素以及它们是什么 id。当然可以获取所有 1 级 id,然后找到该 id 的所有子级。但是如果我们想要获取非常深层次的元素,这听起来有点复杂
  • 我认为没有办法从树中识别元素的级别。我能想到的最佳选择是在数据库中添加另一个字段来标识级别,然后确保在编辑元素时更改该字段。
  • 你几乎可以用嵌套的集合树做任何事情,但在表中缓存关卡可能是个好主意。

标签: sql cakephp nested-sets cakephp-2.4


【解决方案1】:

这可以在纯 SQL 中完成。您甚至可以获得每个节点的后代数量。

 SELECT n.name,
         COUNT(*)-1 AS level,
         ROUND ((n.rgt - n.lft - 1) / 2) AS offspring
    FROM tree AS n,
         tree AS p
   WHERE n.lft BETWEEN p.lft AND p.rgt
GROUP BY n.lft
ORDER BY n.lft;

如果您在GROUP 语句之后添加HAVING level = 2,它可能只会获得您正在寻找的级别。老实说我现在一直懒得测试它,把它变成一个CakePHP find()数组,试试看。

这个网站http://www.klempert.de/nested_sets/对如何处理树木有很好的解释,但是它是用德语写的,你可以尝试通过谷歌翻译来翻译它。

【讨论】:

  • 我在groups 表上进行了测试,它似乎可以工作。请注意:是rght 而不是rgt
  • 嗨,它工作得很好(正如 arilia 写的 rght insted of rgt),但我不知道如何将查询结果限制为单级。 AND level = x 返回查询异常“'where 子句'中的未知列'level'”
  • @hawlikus 在 GROUP 语句后添加 HAVING level = 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2020-07-12
  • 2010-12-08
  • 2018-02-07
  • 2016-10-05
  • 1970-01-01
  • 2011-01-28
相关资源
最近更新 更多