ThinkPHP5 使用记录

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、错误请求地址异常处理

  • 1、非法操作请求

当请求控制器中不存在的方法时,会报如下错误
在这里插入图片描述
针对这种情况,TP有特定的方法处理,只需要在控制器中定义名称为_empty的方法,请求不存在的方法时,会自动调用_empty方法。

  • 2、 非法控制器请求

当请求的控制器不存在时,会报如下错误
在这里插入图片描述
TP针对这种情况,也给出了解决方法。在默认配置中,有如下配置
在这里插入图片描述
只要在对应的模块下,实现Error控制器类,并建立index方法,当请求不存在的控制器时,就会自动调用Error下的index方法

  • 3、 非法模块请求

当请求的模块不存在时,会报如下错误
在这里插入图片描述
针对这种情况,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;

猜你喜欢

转载自blog.csdn.net/u012830303/article/details/105712246