现正在编写一个学习网站项目用于参加全国中小学电脑制作活动,使用ThinkPHP框架

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

最初设想是使用ThinkPHP的关联模型,该模型代码( 释义请查阅ThinkPHP相关文档)如下:

但是由于关联模型查询原理是根据声明的外键来对对应表再进行查询,假使我做的评论分页,一次显示十条评论,一条评论下面最多一次显示十条子评论,先要查询出一级评论,再根据记录再查询用户信息、文章信息、字评论等等,显示一次评论,就要有十几条查询。

效率实在是太低,个人认为,关联模型最佳适于数据库CURD(增删改查)当中的增删改。

于是放弃这个想法,想到还可以用视图模型。遂创建一个视图模型,代码(释义同样请查阅ThinkPHP相关文档)如下:

代码如下

word', '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.111com.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字段,进行相应的处理,这里不再赘述,读者可以自行尝试。

最终效果:

php二级评论怎么实现,ThinkPHP视图模型实现二级嵌套评论的查询相关推荐

  1. thinkphp 视图模型 两个字段映射同一个表

    thinkphp 视图模型 是挺好用的. 这里有一种情况,例如一个文章表,有一个字段是add_admin_id, 用于记录添加者的id,还有一个字段edit_admin_id, 用于记录最后编辑者的i ...

  2. ajax下拉框二级联动 php,关于thinkphp 与 ajax 实现二级联动下拉列表

    表的结构 cId 分类id cName 分类名称 gid 父级id 这是我的HTML页面 <volist name="rs" id="val"> & ...

  3. thinkphp通过模型查询mysql_thinkPHP视图模型详解,把mysql表关联简单化!

    学过sql的人都知道有表左关联,右关联,但是sql语句要写很多,非常容易出错,而ThinkPHP的视图模型则简单化很多了.还发现个问题,貌似ThinkPHP手册写的很多东西都不是很完善,很多人看了都不 ...

  4. ThinkPHP 3.2.3 视图模型的使用

    ThinkPHP 3.2.3 试图模型的手册地址是:http://www.kancloud.cn/manual/thinkphp/1781 实例 需求:在博客列表页读取博客的(id.标题.摘要.发布时 ...

  5. php视图模型,ThinkPHP中视图模型详解.

    很多TP的新手对于模型中的视图模型不甚了解,官方虽然有详细手册,但是对于初学者来说还是比较难以理解! 先简单说一下视图模型所能实现的功能,基本就是主表与副表之间各个字段的关联问题,实现多表关联查询,相 ...

  6. php视图查询的优势,ThinkPHP视图查询详解

    搜索热词 ThinkPHP提供的视图查询应用功能十分强大,用户利用视图查询功能可以将多个数据表的字段内容按需要进行指定和筛选,组织成一个基于这些数据表的视图模型,然后就可以通过该模型直接进行多表联合查 ...

  7. ThinkPHP关联模型详解

    在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个 ...

  8. Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据

    第12部分:改进视图模型和示例数据 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...

  9. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

最新文章

  1. Mongodb常用增删改查语法
  2. 什么样的鼠标对程序员最有用,超级提高开发效率
  3. SegNet 语义分割网络以及其变体 基于贝叶斯后验推断的 SegNet
  4. PHP的require与include
  5. 发票二维码扫描增强_03_图像预处理_01_图像切片
  6. 过来人告诉你Python应该这么学
  7. arcgis api for js共享干货系列之二自定义Navigation控件样式风格
  8. redis内存淘汰和持久化_REDIS的淘汰机制与持久化
  9. 解决vmware报错:Mac OS X is not supported with binary translation.
  10. 13、TCP Socket与UDP Socket
  11. 计算机专业监理员工作,监理员是干什么的
  12. 灰度图像放大_matlab
  13. java8时间转换函数学习,教你脱离jdf转换的痛苦
  14. Triangle程序编译
  15. 找零程序Java_动态规划——硬币找零问题(java)
  16. 计算机系统运行太慢,如何解决电脑运行速度慢
  17. 声纹识别--基础学习笔记
  18. 如何基于4P理论做运营?
  19. 160cracked-2
  20. gazebo仿真rotors调整实时比例的方法

热门文章

  1. Iocomp .net仿真仪表控件包
  2. mysql mysql_real_connect 内存泄露
  3. c 宏变量/宏函数/log
  4. js如何操作或是更改sass里的变量
  5. 13-union 、distinc、 join
  6. 我们来说一说TCP神奇的40ms
  7. FFmpeg纯净版解码 av_parser_parse2
  8. 【三】MongoDB文档的CURD操作
  9. WIN7打补丁后VS2012出现版本不兼容
  10. 求整数 在二进制表示中有多少个1的方法