## **数据列表输出**
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();
```