我们在网上阅读文章时,当阅读完一篇感兴趣的文章时,还不够尽兴,还想阅读一些相关的文章,在文章的末尾往下看,就会发现相关阅读列出和本次阅读的文章相关的篇章,我们点击又可以阅读了,节省了搜索时间。在注重用户体验的设计方面来说,相关阅读功能肯定是少不了的。
实现相关阅读的方法很多,这里是根据相同标签的方法去列出相关的文章,其原理是文章的标签如果相同,那么它们的标签的ID也会相同,因此列出一篇文章的相关文章其实就是列出和其标签相同的文章。
好了,进入正题吧。准备两张关联的表wb_tagged和wb_news,具体数据如下:
01 | -- ---------------------------- |
02 | -- Table structure for `wb_tagged` |
03 | -- ---------------------------- |
04 | DROP TABLE IF EXISTS `wb_tagged`; |
05 | CREATE 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, |
11 | KEY `module` (`module`) |
12 | ) ENGINE=MyISAM CHARSET=utf8; |
14 | -- ---------------------------- |
15 | -- Table structure for `wb_news` |
16 | -- ---------------------------- |
17 | DROP TABLE IF EXISTS `wb_news`; |
18 | CREATE 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' , |
23 | ) ENGINE=MyISAM CHARSET=utf8; |
注:wb_news表的ID关联wb_tagged表的recordId
接下来定义上面两张表的视图模型RelaNewsView,代码如下:
02 | class RelaNewsViewModel extends ViewModel { |
04 | public $viewFields = array ( |
06 | 'News' => array ( 'id' , 'title' , 'status' ), //根据需求筛选news表的字段 |
08 | 'Tagged' => array ( 'tagId' , 'recordId' , '_on' => 'Tagged.recordId=News.id' ), |
上面模型代码中,news和tagged的关联点是“_on'=>'Tagged.recordId=News.id'”,这是一个查询条件,在模型定义好后,在后面的查询语句中就不用再重复写这个条件了。
视图模型定义好,下面是相关阅读的查询语句方法,当然你可以使用sql语句来查询,这里我喜欢用ThinkPHP的视图模型来实现。
07 | public function relaread( $ModelName , $rid , $ViewName ) { |
09 | $tagId =M( 'Tagged' )->field( 'tagId' )->where( array ( |
10 | 'module' => $ModelName , |
11 | 'recordId' => trim( $rid |
12 | )))->getField( 'tagId' ); //获取标签tagId |
14 | if ( $relalist !== false) { |
16 | $map [ 'tagId' ] = $tagId ; |
18 | $map [ 'id' ] = array ( //过滤本篇文章在相关文章列表列出 |
22 | $map [ 'recordId' ] = array ( |
26 | $relalist = D( $ViewName )->where( $map )->order( 'id desc' )->select(); //相关阅读查询语句 |
28 | return $relalist ; //返回相关文章列表 |
32 | //最后,我们调用使分配到模板read.html |
33 | public function read( $ModelName ) { |
34 | if ( empty ( $_GET [ 'id' ])) $this ->error404(); |
36 | $relalist = $this ->relaread( 'News' , $_GET [ 'id' ], 'RelaNewsView' ) //在这里调用上面的relaread函数 |
38 | $this ->assign( 'relalist' , $relalist ); |
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。