我有两个实体,post
和 category
,它们是 1:n
关系。
我有一个包含两列的引用表,post_id
,category_id
categories
表有一个id
列、一个status
列和一个parent_id
列
如果一个类别是另一个类别的子类别(n 深度),那么它的 parent_id
不为空。
如果类别在线则状态为 1,否则为 0。
我需要做的是找出帖子是否可见。
这需要:
对于加入帖子的每个类别,如果这些类别中的任何一个具有 status
0 那么该路径被认为是离线的。
如果任何路径在线,则该帖子被认为是可见的,否则它是隐藏的。
我能想到的唯一方法(作为半伪代码)是:
function visible(category_ids){
categories = //select * from categories where id in(category_ids)
online = false
foreach(categories as category){
if(category.status == 0)
continue;
children = //select id from categories where parent_id = category.id
if(children)
online = visible(children)
}
return online
}
categories = //select c.id from categories c join posts_categories pc on pc.category_id = c.id where pc.post_id = post.id
post.online = visible(categories)
但这最终可能会变成大量的 sql 查询,有没有更好的方法?
最佳答案
如果嵌套集不是一个选项,我知道以下内容:
- 如果数据是有序的,这样父项的子项总是跟在父项之后,您可以通过跳过输出中的隐藏节点,对所有数据进行一次数据库查询来解决此问题。
这同样适用于已排序的嵌套集,原则已在 this answer 中概述,但是有关获取深度的算法不起作用,我建议使用能够删除隐藏项的 recursive iterator。
此外,如果数据未排序,您可以从所有行的(未排序的)查询创建树结构,如 the answer to Nested array. Third level is disappearing 中所述。不需要递归,你会得到一个你可以轻松输出的结构,我也应该在另一个答案中涵盖 <ul>/<li>
html 样式输出。
关于php - 检查 n 深度树中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12758853/