最初设想是使用ThinkPHP的关联模型,该模型代码( 释义请查阅ThinkPHP相关文档)如下:
代码如下 | 复制代码 |
class ArticleCommentModel extends RelationModel {
protected $_link = array( 'User'=>array('mapping_type' => BELONGS_TO, 'foreign_key' => 'uid', 'mapping_fields' => 'id,username,email', 'mapping_name' => 'user', ), 'Article' => array('mapping_type' => BELONGS_TO, 'foreign_key' => 'aid', 'mapping_fields' => 'id,res,gpid,gdid,sid,cid,desc,title', 'mapping_name' => 'article', ), 'ArticleComment'=>array( 'mapping_type'=>HAS_MANY, 'foreign_key'=>'id', 'parent_key'=>'pid', 'condition'=>'pid!=0', 'mapping_name' => 'comments', ), 'ArticleApplaud'=>array( 'mapping_type'=>HAS_MANY, 'foreign_key'=>'cid', 'parent_key'=>'id', 'mapping_name' => 'applaud', ), ); } ?> |
但是由于关联模型查询原理是根据声明的外键来对对应表再进行查询,假使我做的评论分页,一次显示十条评论,一条评论下面最多一次显示十条子评论,先要查询出一级评论,再根据记录再查询用户信息、文章信息、字评论等等,显示一次评论,就要有十几条查询。
效率实在是太低,个人认为,关联模型最佳适于数据库CURD(增删改查)当中的增删改。
于是放弃这个想法,想到还可以用视图模型。遂创建一个视图模型,代码(释义同样请查阅ThinkPHP相关文档)如下:
代码如下 | 复制代码 |
class CommentViewModel extends ViewModel { ?> |
上述代码还未写出文章相应信息的查询(如有需要增加即可)。查询代码如下:
代码如下 | 复制代码 |
$article = D('CommentView'); //实例化Comment视图模型 |
原理根据注释很好理解。
1.先查询出pid为0的评论(即为一级评论)
2.将一级评论的评论ID记录下来,生成SQL条件子句
3.使用生成的条件字句进行查询,查询出之前查询出来的一级评论下面的二级评论
4.将查询出来的代码按树形数组格式进行处理,生成comments变量,赋给模板显示
该方法只查询了两次数据库,效率得到了大大的提高。
如果想要做到多级评论,可以再加一个level字段,进行相应的处理,这里不再赘述,读者可以自行尝试。
最终效果: