我們看完模板了,回到查詢。
看看歸檔是如何實現的。
歸檔,故名思議就是按照月份,將你的博文分類在一塊顯示。
先看搜索。
歸檔對應的url 為 /year/month
這個是通過空模塊空方法路由過去的。

然后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>
~~~
- 序
- 前言
- 內容簡介
- 目錄
- 基礎知識
- 起步
- 控制器
- 模型
- 模板
- 命名空間
- 進階知識
- 路由
- 配置
- 緩存
- 權限
- 擴展
- 國際化
- 安全
- 單元測試
- 拿來主義
- 調試方法
- 調試的步驟
- 調試工具
- 顯示trace信息
- 開啟調試和關閉調試的區別
- netbeans+xdebug
- Socketlog
- PHP常見錯誤
- 小黃鴨調試法,每個程序員都要知道的
- 應用場景
- 第三方登錄
- 圖片處理
- 博客
- SAE
- REST實踐
- Cli
- ajax分頁
- barcode條形碼
- excel
- 發郵件
- 漢字轉全拼和首字母,支持帶聲調
- 中文分詞
- 瀏覽器useragent解析
- freelog項目實戰
- 需求分析
- 數據庫設計
- 編碼實踐
- 前端實現
- rest接口
- 文章發布
- 文件上傳
- 視頻播放
- 音樂播放
- 圖片幻燈片展示
- 注冊和登錄
- 個人資料更新
- 第三方登錄的使用
- 后臺
- 微信的開發
- 首頁及個人主頁
- 列表
- 歸檔
- 搜索
- 分頁
- 總結經驗
- 自我提升
- 進行小項目的鍛煉
- 對現有輪子的重構和移植
- 寫技術博客
- 制作視頻教程
- 學習PHP的知識和新特性
- 和同行直接溝通、交流
- 學好英語,走向國際
- 如何參與
- 瀏覽官網和極思維還有看云
- 回答ThinkPHP新手的問題
- 嘗試發現ThinkPHP的bug,告訴官方人員或者push request
- 開發能提高效率的ThinkPHP工具
- 嘗試翻譯官方文檔
- 幫新手入門
- 創造基于ThinkPHP的產品,進行連帶推廣
- 展望未來
- OneThink
- ThinkPHP4
- 附錄