我有一个表指向同一个表(id, parent_id, data)
中的另一行(或为空)。parent_id
是否有标准方法来查询(1)某个id的所有祖先和(2)某个id的所有后代?
我也在做这个DBIx::Class
,所以如果有一个最方便的方法可以用那个模块(或其他模块)来做,我也很想听听。
编辑:澄清-所有父母=所有祖先,所有孩子=所有后代。
我有一个表指向同一个表(id, parent_id, data)
中的另一行(或为空)。parent_id
是否有标准方法来查询(1)某个id的所有祖先和(2)某个id的所有后代?
我也在做这个DBIx::Class
,所以如果有一个最方便的方法可以用那个模块(或其他模块)来做,我也很想听听。
编辑:澄清-所有父母=所有祖先,所有孩子=所有后代。
这在很大程度上取决于您使用的 SQL 的风格。
在 Oracle 中,您可以使用该START WITH id = yourid CONNECT BY PRIOR id = parent_id
构造。在 PostgreSQL 中,您可以使用函数connectby('tablename', 'id', 'parent_id', 'id', value, 0)
。
在许多情况下,通过定义一个列来以不同方式表示树是有意义的,该列将为每个节点保存从根元素到该节点的完整路径。
网上有很多这种技术的例子,我最近看到的一个也处理DBIx::Class
. -forum-sql.html
看来我们现在要去DBIx::Class::Tree::AdjacencyList
。它几乎可以完成我一直在寻找的所有事情(不幸的是,没有祖先结果集 - 但我们可以通过解决我们需要从另一个方向提出的问题来解决这个问题)。
但是,@Grrrr 的回答让我开始思考,我们可能会添加一个单独的表 + 模块(id, record_type, record_ancestors)
,该模块将附加到具有parent_id
列并提供ancestors
结果集的模型(基本上通过执行 search_rs ,其中 id 位于相关祖先行的拆分中通过我们选择的 w/e 分隔符)。仅仅为了得到这样的结果集就需要做相当多的工作,所以我们可能只会在发现“这是父母 x 的孩子”和真正需要“这是孩子 x”?
编辑:或者也许我们会使用DBIx::Class::Tree::Mobius
- 虽然看起来原始查看表格会令人难以理解。