我有两个实体,post
这category
是一个1:n
关系。
我有一个包含两列的参考表post_id
,category_id
表categories
有一id
列,一status
列,一parent_id
列
如果一个类别是另一个类别(n 深度)的子类别,则它parent_id
不为空。
如果一个类别在线,则其状态为 1,否则为 0。
我需要做的是找出帖子是否可见。
这需要:
Foreach 类别加入到帖子跟踪它的树到根节点(直到类别具有parent_id
== null
),如果这些类别中的任何一个具有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 查询,有没有更好的方法?