🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
我们看完模板了,回到查询。 看看归档是如何实现的。 归档,故名思议就是按照月份,将你的博文分类在一块显示。 先看搜索。 归档对应的url 为 /year/month 这个是通过空模块空方法路由过去的。 ![2015-06-30/5592b848418e9](http://box.kancloud.cn/2015-06-30_5592b848418e9.png) 然后archive 归档方法: ~~~ //归档 public function archive($year, $month){ $_GET['month'] = $month; $_GET['year'] = $year; $this->assign('title', "{$year}年{$month}月的文章"); $this->assign('year', $year); $this->assign('month', $month); $this->lists(I('get.page', 1)); $this->display('Index/index'); } ~~~ 参数绑定后,定义了标题,赋值了year和month模板变量。 实际上还是走的lists方法。 而lists方法里 在之前deadline参数前面 有这么一段: ~~~ //归档搜索 if(isset($_GET['year']) && isset($_GET['month'])){ $year = CONTROLLER_NAME; $month = ACTION_NAME; $map['_string'] = "`deadline` LIKE binary('{$year}-{$month}%')"; } ~~~ 就是当有归档时间参数时,直接这样查询 like查询,因为我们的deadlien 是datetime 格式的,显示时是2015-06-11 h:i:s 这种格式的,所以可以直接like。 注意:mysql 5.5 以上版本 日期格式字符串 like 要这样写才不会报错。 查询结束后,我们需要把所有文章的归档日期组装出来。 ~~~ //获取归档 $list = $postModel->where($map)->order('`deadline` DESC,`id` DESC')->select(); $date = $time = array(); foreach ($list as $key => $value) { if($value['deadline']) $time[] = date('F Y', strtotime($value['deadline'])); } $time = array_unique($time); foreach ($time as $key => $value) { $date[] = array( 'text'=> $value, 'link'=> date('Y/m', strtotime($value)) ); } $this->assign('archive', $date); ~~~ 这边先这种方式获取。 这里有两个优化点: 1. 查询归档时查询所有字段,当数据量大时,内存占用多,应该只查deadline字段; 2. 像标签和归档这些可以做一个缓存,当有数据删除或者新增时重新更新缓存,不过这个要看读写频次比了。 前台显示,和标签一样就是遍历显示了: ~~~ <div class="sidebar-module"> <h4>归档</h4> <ol class="list-unstyled"> <volist name="archive" id="vo"> <li><a href="{:U($vo['link'])}">{$vo.text}</a></li> </volist> </ol> </div> ~~~