## **數據列表輸出**
ThinkLibrary 與 ThinkPHP 組合起來就是現在的 ThinkAdmin v5,都是基于 Composer 來管理;
如果需要使用到 ThinkLibrary 里面的功能,控制器需要繼承 `\library\Controller` 類。
### **數據列表操作**
在控制器訪問中只需加入`$this->page(表名)`可以顯示默認數據表的分頁列表。
如果需要對列表進行條件處理,可以使用查詢器來實現。如:
```php
// 創建查詢器(查詢器支持鏈式操作)
$query = $this->_query('表名')->where(['status'=>'1']);
// 查詢器分頁輸出
$query->page();
```
**注意**:在 ThinkPHP 5.1 之后,控制器不需要直接返回內容了,函數`_page`里面使用`HttpResponseException`直接輸出機制。
另外對于`url`輸入的變量也可以快速輸入到查詢器條件中,如:
```php
// 創建查詢器
$query = $this->_query('表名');
// 切入url參數,接收 username 和 sex 并使用 like 查詢,接收 status 使用 eq 查詢
$query->like('username,sex')->equal('status');
// 查詢器分頁輸出
$query->page();
```
有時候,`url`輸入的名稱與數據字段不一定是匹配的,所以需要用到別名,這里就需要按規則寫條件,如:
```php
// 切入url參數,接收 username_alias 和 sex 并使用 like 查詢,接收 user_status 使用 eq 查詢
// 這里用到了別名,username_alias 對應數據庫中的 username 字段,user_status 對應數據庫的 status 字段
$query = $this->_query('表名')->like('username#username_alias,sex')->equal('status#user_status');
// 查詢器分頁輸出
$query->page();
```
輸出額外數據到模板,與 ThinkPHP 操作無異,如:
```php
// 額外列表數據賦值到模板,模板里直接使用變量 $userList
$this->userList = Db::name('User')->where(['status'=>'1'])->select();
// 切入url參數,接收 username 和 sex 并使用 like 查詢,接收 status 使用 eq 查詢
$query = $this->_query('表名')->like('username,sex')->equal('status');
// 查詢器分頁輸出
$query->page();
```
#### 數據回調處理
對于通過`page`方法實現的即將顯示到模板的列表,還可以進行引用二次處理,如:
```php
protected function _page_filter(&$data){
// 這里可以對 $data 進行二次處理,注意是引用
}
### 當一個控制器存在多個page操作時,可以指定回調前綴
protected function _index_page_filter(&$data){
// 精準回調對 $data 進行二次處理,注意是引用
}
```
-----
下面提供一個完整的DEMO
~~~
/**
* 系統操作日志
* @auth true
* @menu true
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function index()
{
$this->title = '系統操作日志';
$query = $this->_query($this->table)->like('action,node,content,username,geoip');
$query->dateBetween('create_at')->order('id desc')->page();
}
/**
* 列表數據處理
* @param array $data
* @throws \Exception
*/
protected function _index_page_filter(&$data)
{
$ip = new \Ip2Region();
foreach ($data as &$vo) {
$result = $ip->btreeSearch($vo['geoip']);
$vo['isp'] = isset($result['region']) ? $result['region'] : '';
$vo['isp'] = str_replace(['內網IP', '0', '|'], '', $vo['isp']);
}
}
~~~
快捷查詢器同樣保留原 ThinkPHP Query 的功能,也可以使用關聯查詢。
```php
// 我們可以獲取到ThinkPHP默認Db操作對象
// 在這里對Db進行操作,如果 $db->where()->buildSql() 等等
$db = $this->_query('表名')->db();
// 對于聯表操作,需要指定 filed,join 如果用到了條件查詢,一定要用上別名查詢
$query = $this->_query('table_a')->alias('a')->field('a.id,a.name,b.pid,b.nickname');
$query->join('table_b b','a.id=b.pid')->like('a.name#a_name')->page();
```