我们在网上阅读文章时,当阅读完一篇感兴趣的文章时,还不够尽兴,还想阅读一些相关的文章,在文章的末尾往下看,就会发现相关阅读列出和本次阅读的文章相关的篇章,我们点击又可以阅读了,节省了搜索时间。在注重用户体验的设计方面来说,相关阅读功能肯定是少不了的。
实现相关阅读的方法很多,这里是根据相同标签的方法去列出相关的文章,其原理是文章的标签如果相同,那么它们的标签的ID也会相同,因此列出一篇文章的相关文章其实就是列出和其标签相同的文章。
好了,进入正题吧。准备两张关联的表wb_tagged和wb_news,具体数据如下:
01-- ----------------------------
02-- Table structurefor `wb_tagged`
03-- ----------------------------
04DROP TABLE IF EXISTS `wb_tagged`;
05CREATE TABLE `wb_tagged` (
06`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
07`recordId` int(11) unsigned NOT NULL,
08`tagId` int(11) NOT NULL,
09`module` varchar(25) NOT NULL,
10PRIMARY KEY (`id`),
11KEY `module` (`module`)
12) ENGINE=MyISAM CHARSET=utf8;
13
14-- ----------------------------
15-- Table structurefor `wb_news`
16-- ----------------------------
17DROP TABLE IF EXISTS `wb_news`;
18CREATE TABLE `wb_news` (
19`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
20`title` varchar(80) NOT NULL DEFAULT'',
21`status` tinyint(1) NOT NULL DEFAULT'0',
22PRIMARY KEY (`id`)
23) ENGINE=MyISAM CHARSET=utf8;
注:wb_news表的ID关联wb_tagged表的recordId
接下来定义上面两张表的视图模型RelaNewsView,代码如下:
01<?php
02class RelaNewsViewModelextends ViewModel {
03
04public $viewFields =array(
05
06'News'=>array('id','title','status'),//根据需求筛选news表的字段
07
08'Tagged'=>array('tagId','recordId','_on'=>'Tagged.recordId=News.id'),
09);
10}
11?>
上面模型代码中,news和tagged的关联点是“_on'=>'Tagged.recordId=News.id'”,这是一个查询条件,在模型定义好后,在后面的查询语句中就不用再重复写这个条件了。
视图模型定义好,下面是相关阅读的查询语句方法,当然你可以使用sql语句来查询,这里我喜欢用ThinkPHP的视图模型来实现。
01/*
02*相关阅读
03*$ModelName:模型名称
04*$rid:文章ID
05*$ViewName 视图模型名称
06*/
07public function relaread($ModelName,$rid,$ViewName) {
08
09$tagId=M('Tagged')->field('tagId')->where(array (
10'module' =>$ModelName,
11'recordId' => trim($rid
12)))->getField('tagId');//获取标签tagId
13
14if ($relalist !== false) {
15
16$map['tagId'] =$tagId;
17$map['status'] = 1;
18$map['id'] =array (//过滤本篇文章在相关文章列表列出
19'neq',
20$rid
21);
22$map['recordId'] =array (
23'neq',
24$rid
25);
26$relalist = D($ViewName)->where($map)->order('id desc')->select();//相关阅读查询语句
27
28return $relalist;//返回相关文章列表
29
30}
31}
32//最后,我们调用使分配到模板read.html
33public function read($ModelName) {
34if (empty ($_GET['id']))$this->error404();
35
36$relalist=$this->relaread('News',$_GET['id'],'RelaNewsView')//在这里调用上面的relaread函数
37
38$this->assign('relalist',$relalist );
39}