ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ``` $model::getList($where, $this->pageSize, ['date_year'=>"desc",$orderByColumn => $isAsc,"subject"=>'desc']); ``` $this->pageSize:控制器初始化时获取pageSize参数,不存在加载配置文件的 getList==》getList==》changeTableData ## **getList** getList返回的时当前模型组装为表格所需的的数据集,下一步就是将数据级转换为数组并且转时间格式等 ``` // 获取列表 public static function getList(array $where = [], int $pageSize = 0, array $order = ['sort', 'id' => 'desc']) { $model = new static(); $model = $model->alias($model->getName()); // 获取with关联 $moduleId = \app\common\model\Module::where('model_name', $model->getName())->value('id');//当前运行模型的id $fileds = \app\common\model\Field::where('module_id', $moduleId) ->select() ->toArray();//查出当前运行模型对应数据表的字段信息 $listInfo = []; // 字段根据关联信息重新赋值 $withInfo = []; // 模型关联信息 $fieldInfo = []; // 字段包含.的时候从关联模型中获取数据 foreach ($fileds as $filed) { // 数据源为模型数据时设置关联信息 if ($filed['data_source'] == 2) {//字段管理-数据源-模型数据 0是字段本身,1是系统字典 $listInfo[] = [ 'field' => $filed['field'], 'relation_model' => lcfirst($filed['relation_model']),//字段管理-关联模型 'relation_field' => $filed['relation_field'],//字段管理-关联字段 ]; $withInfo[] = lcfirst($filed['relation_model']);//字段管理-关联模型存在则 $withInfo } // 字段包含.的时候从关联模型中获取数据 if (strpos($filed['field'], '.') !== false) { $filedArr = explode('.', $filed['field']); $fieldInfo[] = [ 'field' => $filed['field'], 'relation_model' => lcfirst($filedArr[0]), 'relation_field' => $filedArr[1], ]; } } if ($withInfo) {//字段管理-关联模型存在则with关联模型 $model = $model->with($withInfo); } if ($where) { $whereNew = []; $whereHas = []; foreach ($where as $v) { if (strpos($v[0], '.') === false) { $whereNew[] = $v; } else { // 关联模型搜索 $filedArr = explode('.', $v[0]); $whereHas[lcfirst($filedArr[0])][] = [ 'field' => $filedArr[1], 'field_option' => $v[1], 'field_value' => $v[2], ]; } } // 关联模型搜索 if ($whereHas) { foreach ($whereHas as $k => $v) { $model = $model->hasWhere($k, function ($query) use ($v) { foreach ($v as $vv) { $query->where($vv['field'], $vv['field_option'], $vv['field_value']); } }); } } // 当前模型搜索 if ($whereNew) { $model = $model->where($where); } } if ($pageSize) {//传入pageSize参数则执行tp分页方法 $list = $model->order($order) ->paginate([ 'query' => Request::get(), 'list_rows' => $pageSize, ]); } else { $list = $model->order($order) ->select(); } foreach ($list as $v) { foreach ($listInfo as $vv) { $v[$vv['field']] = !empty($v->{$vv['relation_model']}) ? $v->{$vv['relation_model']}->getData($vv['relation_field']) : ''; } foreach ($fieldInfo as $vv) { $v[$vv['field']] = !empty($v->{$vv['relation_model']}) ? $v->{$vv['relation_model']}->getData($vv['relation_field']) : ''; } } return MakeBuilder::changeTableData($list, $model->getName()); } ``` 由于使用了paginate,list返回的是Paginator对象,`object(think\paginator\driver\Bootstrap)#589 (8) ...` Paginator对象还附带返回per_page等等 $list->toArray();结果: ``` array(5) { ["total"]=> int(65) ["per_page"]=> int(99) ["current_page"]=> int(1) ["last_page"]=> int(1) ["data"]=> array(65) { [0]=> array(22) { ["id"]=> int(56) ["create_time"]=> string(19) "2021-09-25 07:52:07" 。。。 ``` >[danger] 此cms的表格的数据只需要total和data组成的数据 `per_page`这些参数都是tp pagenate方法冗余的 此cms封装了bootstraptable的responseHandler参数来处理后台数据以适应bootstraptable ``` responseHandler: function(res) { if (typeof $.table._option.responseHandler == "function") { $.table._option.responseHandler(res); } return { rows: res.data, total: res.total }; }, ``` ## **changeTableData:tableData转化为bootstrap需要的数据格式** ``` /** * 列表展示时改变为需要的格式[日期、时间、日期时间] * @param $tableData * @param string $modelName * @return mixed */ public function changeTableData($tableData, string $modelName) { // 转换为数组[注意是否分页] $tableData = is_array($tableData) ? $tableData : $tableData->toArray(); if (array_key_exists('total', $tableData) && array_key_exists('per_page', $tableData)) { $page = true; $data = $tableData['data']; } else { $page = false; $data = $tableData; } // 查询模块信息 $module = \app\common\model\Module::where('model_name', $modelName)->find(); // 查询字段信息 $fields = self::getFields($module->table_name); if (empty($fields)) { return $tableData; } $fieldsNew = []; foreach ($fields as $k => $v) { $fieldsNew[$v['field']] = $v; } foreach ($data as $k => $v) { foreach ($fieldsNew as $kk => $vv) { // 只对列表中出现的字段做处理,添加时间和修改时间不做处理 if (array_key_exists($kk, $v) && $kk != 'create_time' && $kk != 'update_time') { // 改变日期等格式 if ($vv['type'] == 'date' || $vv['type'] == 'time' || $vv['type'] == 'datetime') { // 使用每个字段设定的格式 if ($vv['type'] == 'time') { $format = $vv['setup']['format'] ?: 'H:i:s'; } else { $format = $vv['setup']['format'] ?: 'Y-m-d H:i:s'; } $data[$k][$kk] = $data[$k][$kk] === 0 ? '' : date($format, $data[$k][$kk]); } } } } $page == true ? $tableData['data'] = $data : $tableData = $data;; return $tableData; } ```