ThinkPHP实现二级嵌套评论的查询,利用视图模型

以下为评论表结构

其中id为主键自增字段,uid为评论者id,aid为所评论的文章id,pid为上级评论id,comment为评论内容,ctime为评论时间

要实现二级嵌套评论,pid为0的为一级评论,否则为二级评论,二级评论为一级评论的子评论。

 

<?php
class CommentViewModel extends ViewModel {
 public $viewFields = array( 
  'ArticleComment' => array('id','uid', 'aid', 'pid', 'comment', 'ctime'),
  'User' => array('username', 'password', 'email','_on' => 'User.id=ArticleComment.uid', '_type' => "LEFT"),
  'UserInfo' => array('name', 'sex', 'age', 'mobile', 'site', 'address', 'zip', 'intro', '_on' => 'UserInfo.uid=ArticleComment.uid', '_type' => "LEFT"),
  );
}
?>

 上述代码还未写出文章相应信息的查询(如有需要增加即可)。查询代码如下:

$article = D('CommentView'); //实例化Comment视图模型
$articleComments = $article -> where(array('aid' => $aid, 'pid' => 0)) -> limit(10) -> select(); //将一级评论查询出来 www.111cn.net
foreach($articleComments as $comment) {
 $comments[$comment['id']] = $comment; //将查询出来的一级评论按id赋给comments数组
}
$commentID = array_keys($comments); //取出一级评论的id,为下面查询对应的二级评论做准备
if (!empty($commentID)) {
 foreach($commentID as $id) {
  $sqlArray[] = 'pid=' . $id; //生成查询二级评论所用条件数组
 }
 $sql = implode(' OR ', $sqlArray); //将数组连接,生成对应的SQL条件语句
 $articleComments = $article -> where($sql) -> limit(10) -> select(); //查询对应二级评论
 foreach($articleComments as $comment) {
  $comments[$comment['pid']]['comments'][] = $comment; //按树形排列评论
 }
}
$this -> assign('comments', $comments);

 

原理根据注释很好理解。

1.先查询出pid为0的评论(即为一级评论)

2.将一级评论的评论ID记录下来,生成SQL条件子句

3.使用生成的条件字句进行查询,查询出之前查询出来的一级评论下面的二级评论

4.将查询出来的代码按树形数组格式进行处理,生成comments变量,赋给模板显示

该方法只查询了两次数据库,效率得到了大大的提高。

如果想要做到多级评论,可以再加一个level字段,进行相应的处理,这里不再赘述,读者可以自行尝试。

 

 

转载于:https://my.oschina.net/yumufeng/blog/409158

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值