1、下拉框搜索插件,异步更新内容
- 使用tp5模板时,自带的chosen.jquery.js插件,可以使下拉框具有检索功能。
但是使用ajax异步更新select时,select的内容变了,chosen插件生成的下拉框元素内容没有变化,需要另外处理,代码如下
<label class="col-sm-3 control-label">用户类型:</label>
<div class="input-group col-sm-4">
<select class="form-control m-b " name="type" id="type">
<option value="1">普通用户</option>
</select>
</div>
<label class="col-sm-3 control-label">所属公司:</label>
<div class="input-group col-sm-4">
<select class="form-control m-b" name="company_id" id="company_id">
<option value="0">公司列表</option>
</select>
</div>
<script>
$('#type').change(function(){
var type = $(this).val();
$.get('/companys/type/'+ type,function(data){
$('#company_id').html(data);//ajax获取公司的option字符串并更新
$("#company_id").trigger("chosen:updated");//更新chosen生成的元素
},)
});
</script>
2、Model使用问题
① 联表查询
在使用model进行联表查询的时候,用到的所有筛选条件和需查询的字段,都要在字段前加上表名(或别名),否则之后回出现各种异常
② model的复用
需要使用同一个model进行多个操作的时候,如果某一个model执行了select()操作,就会把model之前载入的各中where、join等查询条件清空,之后再用model进行select()操作,不会再执行之前载入的条件。我们遇到多个操作需要使用selec查询时,在select之前可以使用clone 克隆主一个新的model对象,用于某个操作的执行select。
3、Db::name()中,使用group分组后,不能在后面使用count()聚合查询
4、错误请求地址异常处理
当请求控制器中不存在的方法时,会报如下错误
针对这种情况,TP有特定的方法处理,只需要在控制器中定义名称为_empty的方法,请求不存在的方法时,会自动调用_empty方法。
当请求的控制器不存在时,会报如下错误
TP针对这种情况,也给出了解决方法。在默认配置中,有如下配置
只要在对应的模块下,实现Error控制器类,并建立index方法,当请求不存在的控制器时,就会自动调用Error下的index方法
当请求的模块不存在时,会报如下错误
针对这种情况,TP没有专门设置解决方法。但我们可以根据上面两种情况,修改App.php文件,如下
方框中的代码是我新加的,意思是当模块不存在时,我们自定义一个模块,让程序去到这个模块下寻找相应的控制器和方法名。这里要注意下自定义的模块名一定不要用error,会出现莫名其面的问题
APP.php文件修改过后,去application新建模块和控制器,如下
5、api接口返回状态
- 使用tp写接口时,一些预料中的状况,我们可以指定状态码和信息,但有时候是程序的一些异常,我们不能全部做判断。可以借助系统自带的错误处理机制,把系统捕获异常按接口的同一格式返回即可,修改thinkphp/library/think/exception/Handle.php文件,如下
6、where数组条件的多条件查询
- 我们一般使用形如:$where = [‘id’=>1,‘status’=>2] 这种数组作为条件,放在 where($where)中作为查询条件,这样做比较方便扩展,总结常用的几种where多条件的查询方式
//in条件
$where['id'] = ['in',[1,3,4,5]];
//范围查询
$where['id'] = ['between',[11,22]];
//时间范围查询,当字段类型为date,不能无法使用常规的范围查询
$where['date'] = [
['>=','2020-0505'],
['<=','2020-05-30'],
'and'
];
7、控制器获取绑定参数
如:public function index ($page){}
可自动获取get或者post方式传递过来的键名为page的参数。
我之前一直以为这样写,只能获取通过url传递的参数
8、limit查询
Db::name(‘table’)->limit(5,10)->select();
和
Db::name(‘table’)->limit(‘5,10’)->select();
效果时一样的,都是从位置5开始,取10条数据
9、 PHPexcel 导入和导出
导入
//获取上传表单选中的文件信息
$file = request()->file('file');
$info =$file->getInfo();
if(!is_file($info['tmp_name'])) return '文件不存在';
//开始上传
\think\Loader::import('.PHPExcel.PHPExcel.IOFactory');
$objReader = new \PHPExcel_Reader_Excel2007();
if( ! $objReader->canRead($file)) {
$objReader = new \PHPExcel_Reader_Excel5();
if(!$objReader->canRead($file)) {
return json(['code' => 0, 'data' => '', 'msg' => '仅支持 .xls 类型的文件']);
}
}
$objPHPExcel = $objReader->load($file,$encode='utf-8');//加载文件
$sheet = $objPHPExcel->getSheet(1);//取得sheet表
$objPHPExcel->setActiveSheetIndex(1);
$highestRow = $sheet->getHighestRow(); // 取得总行数
//echo $highestRow;exit;
$aa=[];
$salary_arr = Db::name('un_major_salary')->order('salary asc')->column('code');
for($i=3;$i<=$highestRow;$i++)
{
$data=[];
$data['is_red'] = $objPHPExcel->getActiveSheet()->getCell("C".$i)->getValue()??0;
$data['is_yellow'] = $objPHPExcel->getActiveSheet()->getCell("D".$i)->getValue()??0;
$data['is_green'] = $objPHPExcel->getActiveSheet()->getCell("E".$i)->getValue()??0;
Db::name('university_major')->where('major_code',$code)->update($data);
}
导出
$data = collection($company->select())->toArray();
\think\Loader::import('.PHPExcel.PHPExcel.IOFactory');
$obj = new \PHPExcel();
$fileName = $title;
$fileType = "xlsx";
// 设置当前sheet
$obj->setActiveSheetIndex(0);
// 设置当前sheet的名称
$obj->getActiveSheet()->setTitle('list');
// 列标
$list = ['A', 'B', 'C','D','E'];
// 填充第一行数据
$title_E = $type == 1 || $type == 2?'最后清洗时间':'最后检测时间';
$obj->getActiveSheet()
->setCellValue($list[0] . '1', '商户名称')
->setCellValue($list[1] . '1', '联系人')
->setCellValue($list[2] . '1', '联系电话')
->setCellValue($list[3] . '1', '地址')
->setCellValue($list[4] . '1', $title_E);
foreach($data as $i=>$v){
$obj->getActiveSheet()->setCellValue($list[0] . ($i + 2), $v['name']);//将其设置为文本格式
$obj->getActiveSheet()->setCellValue($list[1] . ($i + 2), $v['contacts']);
$obj->getActiveSheet()->setCellValue($list[2] . ($i + 2), $v['phone'], \PHPExcel_Cell_DataType::TYPE_STRING);
$obj->getActiveSheet()->setCellValue($list[3] . ($i + 2), $v['base_address'].$v['address']);
$obj->getActiveSheet()->setCellValue($list[4] . ($i + 2), $v['last_date']);
}
// 设置列宽
$obj->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$obj->getActiveSheet()->getColumnDimension('B')->setWidth(20);
$obj->getActiveSheet()->getColumnDimension('C')->setWidth(20);
$obj->getActiveSheet()->getColumnDimension('D')->setWidth(80);
$obj->getActiveSheet()->getColumnDimension('E')->setWidth(20);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx');
header('Cache-Control: max-age=1');
$objWriter = \IOFactory::createWriter($obj, 'Excel2007');
//输出内容之前要先清理缓冲区,否则可能会出现下载的文件打不开的现象
ob_end_clean();
$objWriter->save('php://output');
exit;