我想我的第一个问题是,由于我是唯一的开发人员,我怀念当我陷入一个问题时,有其他人可以抛出想法,或者获得想法。有没有专门解决这个问题的网站?就像一个虚拟的协作者网站?或者StackOverflow能像这样工作吗?
我的主要问题是:我正在做一个类似于“待办事项”列表的事情,但每一项都可能有子步骤……甚至是子步骤..。甚至更远。我有一个表,其中包含字段"id,item,parent_id",所有顶级项目的parent_id = 0。在CodeIgniter中使用Datamapper ORM时,我使用的是:
$i = new Item();
$i->where('parent_id',0)->get();
foreach($i as $item) {
echo $item->item;
$si = new Item();
$si->where('parent_id',$item->id)->get();
foreach($si as $subItem) {
echo $subItem->item;
// and so on
}
}它是有效的,但有没有更聪明的方法来实现这一点呢?也许是某种递归函数?
我还在研究一种方法,让其他人来管理所有的东西,这样他们就可以将项目拖放到他们需要去的地方……但这完全是另一回事了。
发布于 2010-12-28 23:27:46
如果你编写自己的SQL,你可以在3个查询中做到这一点。
"SELECT * FROM items WHERE parent_id = 0;"
"SELECT * FROM items WHERE parent_id IN (SELECT id FROM items WHERE parent_id = 0;"但是,您看起来想要一个多嵌套的tree-like structure
| item |
| sub-item |
| sub-sub-item |如果您正在使用CI,有一个(在我看来)更好的对象关系映射,称为Doctrine,它将处理自引用树状数据结构(按照您的建议使用递归)。谢天谢地,有一篇很好的文章介绍了如何将它集成到CodeIgniter中!
http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup
理论将为您构建查询-它还支持关系和许多其他方便的功能,如CodeIgniter所缺少的缓存:)
发布于 2010-12-28 23:33:47
如果我是你,我会考虑实现一个树结构。你基本上已经为这里的邻接表建立好了基础(从DB的角度来看--你仍然需要编写和测试php代码)。如果您添加一个level列来定义任何给定任务在其层次结构中所处的级别,您可以通过自联接使用1-2个查询来提取所有数据,但如果嵌套级别非常深,则速度会很慢。
另一种选择是使用嵌套的Set和Preorder Tree遍历,这需要更多的工作,特别是在似乎不需要为每个节点使用多个分支的情况下。
看一下Managing Hierarchical Data in MySQL,它从DB端详细地解释了这两种情况……它是特定于MySQL的,但您应该能够以与DB无关的方式或为另一个特定的DB应用相同的原则。
当然,无论哪种方式,你都需要在PHP端实现映射,这比你现在做的工作要多得多…但它也允许您减少对数据库的访问次数。
我也推荐使用Doctrine ( Seth也推荐)而不是CI Datamapper……它已经实现了所有这些...你只需要学习Doctrine的基础知识,并将其与CI挂钩,我相信上面有大量的教程。
发布于 2010-12-28 23:26:27
Smth,not tested: count($ss)可能不会返回一个好的值来查看查询是否有返回的结果,所以请根据需要进行更新(在Zend中,我可以对Zend_Db_Table_Rowset进行计数,但不能确定CI返回的对象,如果您可以计算结果的数量),请更新if语句,以便仅当有从您的查询返回的结果时才调用函数)
function recursive( $i )
{
foreach ( $i as $item )
{
echo $item->item;
$si = new Item();
$ss = $si->where('parent_id', $item->id)->get();
if ( count($ss) > 0 )
recursive($ss);
}
}
$i = new Item();
recursive($i->where('parent_id', 0)->get());https://stackoverflow.com/questions/4547075
复制相似问题