在thinkphp中有两个filter 函数,一个是数据库查询的filter函数,另外一个是数据集Colletion 的 filter函数。
1、两种filter的区别
- 简单区分这两个函数:数据库查询的filter() 函数,调用位置在 select() 或 find() 前面;数据库 Collection 的 filter() 函数,调用位置在 select() 或 find() 后面。
- 数据库filter的作用是“改造数据”,修改字段内容,不减少行数。
- 数据集Collection的filter的作用是“挑选数据”,会删减行数。
2、数据库 filter 函数使用示例
// 1. 查询filter:只改字段,不删行
$list = Db::table('user')
->filter(function($row){
$row['name'] = strtoupper($row['name']);
return $row;
})
->select();
3、数据集 Collection 的filter 函数使用示例
// 2. 集合filter:内存里删掉未成年
$list = $list->filter(function($row){
return $row['age'] >= 18;
});
4、model filter 使用示例
$list = User::where('user_id', $params['user_id'])
->order('created_time', 'desc')
->filter(function ($row) {
$row['name'] = mb_substr($row['name'], 0, 1) . '***';
return $row;
})
->select();
5、select() 和 find() 使用示例
// 详情
$detail = User::where('id', $id)
->filter(function($item){
$item['status_name'] = $item['status'] == 1 ? '启用' : '关闭';
$item['full_avatar'] = env('APP_URL').'/'.$item['avatar'];
return $item;
})
->find();
// 列表(一模一样的filter回调,可抽成公共函数)
$list = User::filter(function($item){
$item['status_name'] = $item['status'] == 1 ? '启用' : '关闭';
$item['full_avatar'] = env('APP_URL').'/'.$item['avatar'];
return $item;
})->select();