递归检查数据库中孩子的父母
我正在开发一个 CMS 系统,该系统接收如下网址:
/parent1/parent2/child/
现在很容易只检查孩子,但在我看来,您还应该检查父母是否正确且顺序正确。问题是我不确定如何做到这一点。
我正在使用mysql。该表的外观如下:
CREATE TABLE IF NOT EXISTS `pages` (
`id` int(11) NOT NULL auto_increment,
`parent` int(11) NOT NULL default '0',
`title` varchar(255) NOT NULL,
`deleted` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
父字段保留其他页面 ID,这些 ID 在父字段中时将用作父页面。
I'm working on a CMS system that receives urls like this:
/parent1/parent2/child/
Now it's easy to check only the child but in my opinion you should also check if the parents are correct and in the right order. The problem is that I'm unsure on how to do this.
I'm using mysql. this is how that table would look:
CREATE TABLE IF NOT EXISTS `pages` (
`id` int(11) NOT NULL auto_increment,
`parent` int(11) NOT NULL default '0',
`title` varchar(255) NOT NULL,
`deleted` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
the parent field keeps other page ID's that will be used as parent when in the parent field.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
最好的方法是在一个查询中检索完整的表并构建一个嵌套数组。有了 php 中的整个树结构,检查它们是否正确就容易多了。
在此博客上,有有关仅使用一个查询格式化多级菜单的信息:http://crisp.tweakblogs.net/blog/317/formatting-a-multi-level-menu-using-only-one-query.html
其背后的想法是在 php 中递归地构建菜单。如果您能够更改数据库结构,您还可以查看 MPTT(即嵌套集)。通过这种机制,可以更轻松地跟踪树中的父/子关系。缺点是插入或更新节点时 MPTT 速度较慢。更多信息:http://articles.sitepoint.com/article/hierarchical-data-database< /a>
The best is to retreive the complete table in one query and build a nested array. With the whole tree structure in php, it's much easier to check if they are correct.
On this blog there is information about the formating of a multi level menu with only one query: http://crisp.tweakblogs.net/blog/317/formatting-a-multi-level-menu-using-only-one-query.html
The idea behind it is you build the menu recursively in php. If you're able to change your database structure, you can also look at MPTT, or Nested Sets. With this mechanism it's much easier to follow a parent/child relation in a tree. The disadvantage is MPTT is slower when you insert or update nodes. More information: http://articles.sitepoint.com/article/hierarchical-data-database
您可以更改 SQL 表结构以使用树的嵌套集模型;它使得测试是否包含可能深深嵌套在特定父项下的子项变得更加容易。
这个页面对邻接表模型有很好的描述和比较和嵌套集。
您可能会发现以下嵌套集合问题的答案也很有帮助: 帮助编写嵌套集的 SQL 查询
获取 Joe Celko 为聪明人编写的 SQL 树和层次结构。我一直推荐这本书,因为当我使用嵌套集在 SQL 中建模树结构时,它对我帮助很大。
You could change your SQL table structure to use the nested sets model for a tree; it makes it much easier to test for inclusion of a child which may be deeply nested under a particular parent.
This page has a good description and comparison of the adjacency list model and nested sets.
You might find the following answer to a nested set question is also helpful: Help with writing a SQL query for Nested Sets
Pick up a copy of Joe Celko's Trees and Hierarchies in SQL for Smarties. I keep recommending this book because it helped me immensely when I was modelling a tree structure in SQL using nested sets.
如果我正确理解您的要求,您可以执行类似的操作(仅调用一次数据库而不是完整的树!!)
完整的脚本可以在这里找到:http://pastie.org/1250062
希望它有帮助...:)
存储过程调用示例
PHP 脚本示例
SQL< /强>
If I understood your requirements correctly you could do something like this (one call to DB ONLY and NOT FULL TREE!!)
Full script can be found here : http://pastie.org/1250062
Hope it helps... :)
Example stored procedure call
Example PHP script
SQL
好吧,我制定了自己的方法,请不要我使用 kohana,所以我使用 kohana 的查询构建器:
这段代码构建了我想要使用的数组。
这段代码通过数组运行 url,如果父级错误,它就会卡住:
注意:您需要发送到此函数的数据是:
Ok I worked out my own method, Please not I'm using kohana so I'm using the query builder of kohana:
This piece of code builds the array I want to use.
And this piece of code runs the url trough the array it gets stuck if a parent is wrong:
Note: The data you need to send to this function is: