模型中 获取器的3种用法
<?php namespace app\index\model; use think\Model; //使用软删除功能,必须先导入model/concern/SoftDelete.php use think\model\concern\SoftDelete; //实际上一个trait方法集 class Staff extends Model { use SoftDelete; //获取器 protected function getSexAttr($value) { $staff = [0=>'男', 1=>'女']; return '性别:'.$staff[$value]; } //获取器2 protected function getSalaryAttr($value,$data) { return $data['name'].'3月份参考工资:'.($value+200).'元'; } //获取器3: 可以为表中不存在的字段设置获取器方法,纯粹为了拼装字段内容 protected function getStaffInfoAttr($value, $data) { //其实$value此时仅是一个占位符,可任意命名,无任何意义 return '我叫:'.$data['name'].',今年'.$data['age'].'岁,每月工资:'.$data['salary'].'元'; }
控制器实现的代码:
实例
<?php namespace app\index\controller; use think\Controller; use app\index\model\Staff; class ModelEdu extends Controller { //获取器 public function gain() { $res = staff::get(1); // dump($res); echo $res->getData('sex'), '<br>'; echo $res->salary, '<br>'; echo $res->sex, '<br>'; echo $res->staff_info; }
模型中:修改器的两种用法(model\Staff.php)
//修改器1:将入职时间自动转为时间戳存储 protected function setEntryTimeAttr($value) { return strtotime($value); } //修改器2:支持传入第二个参数,引用其它字段的值 protected function setSalaryAttr($value, $data) { //salary字段存入表中时,自动加上员工的年龄,纯粹演示,无实际意义 return $value+$data['age']; //模型实现原理,在控制器输入工资5000,比如年龄是35,则工资5035 } //类型转换 protected $type = [ 'staff_id' => 'interger', 'sex' => 'interger', 'age' => 'interger', 'salary' => 'interger' ]; //自动完成:主要针对新增操作,更新操作 //相当于给字段设置默认值 // protected $inser = ['sex'=>0,'salary'=>1500]; //针对新增操作:当用户新增一条记录时,sex和salary就是默认值 // protected $update = ['sex'=>0]; //针对更新操作:当用户更新一条记录时,sex就是默认值 protected $auto = ['sex'=>0,'salary'=>1500]; //同时针对新增和更新操作
控制器中:修改器代码实例(controller\ModelEdu.php)
//修改器: 先给staff表新增一个字段entry_time: 入职时间 public function modify() { // $res = Staff::get(5); // $res->entry_time = '2017-5-22'; //入职时间 // $res->save(); $res = Staff::get(3); $res->salary = 9900; //修改工资 $res->save(); return '修改成功'; } //自动完成: public function auto() { Staff::create(['name'=>'赵丽颖','age'=>32]); return '新增成功'; }
控制器中:验证器(验证器类、独立验证)(controller/Verify.php)
<?php namespace app\index\controller; use think\Controller; use think\Validate; use app\validate\Staff; //导入验证器 class Verify extends Controller { //验证器: 直接实例化验证器完成验证 public function Demo1() { //准备要验证的数据(字段) $data=[ 'name' => 'PHP中文网', 'sex' => 0, 'age' => 20, 'salary' => 8000 ]; $validate = new Staff(); //实例化 if(!$validate->check($data)) { //判断 dump($validate->getError()); }else{ return '验证通过'; } } //验证器: 使用控制器内容的验证对象来完成验证: $this->validate($data, $rule) public function Demo2() { //1. 准备要验证的数据(字段) // $data=[ // 'name' => 'PHP中文网', // 'sex' => 0, // 'age' => 20, // 'salary' => 8000 // ]; // //准备一下验证规则 // $rule = 'app\Validate\Staff'; // $res = $this->validate($data,$rule); //2. 也可以直接在控制器中进行验证 $data = ['age' => 35]; //数据输出 $rule = ['age' => 'between:10,50']; //验证年龄的范围,大于或小于当前值就会触发下面的错误提示信息 $mess = ['age.between' => '年龄必须在10至50之间']; $res = $this->validate($data,$rule,$mess); if(true !== $res) { //验证成功返回true,否则返回错误信息 return $res; } return '验证通过'; } //独立验证:直接实例化think\Validate.php进行验证 public function Demo3() { //主要是通过Validate::make()和check()进行验证 //make($rule,$mess):创建验证规则与错误信息 //check($data)完成数据验证 //1.创建验证规则 $rule = ['age' => 'require|between:18,60']; //2.创建错误信息 $mess = [ 'age.requeire' => '年龄必须填写', 'age.between' => '年龄必须在18至60之间' ]; //3.创建数据 $data = ['age' => 33]; //初始化验证器类,并返回验证器实例 $validate = Validate::make($rule, $mess); $res = $validate->check($data); return $res ? '验证成功' : $validate->getError(); } }
验证器:创建验证规则及属性进行配置
Validate/Staff.php
<?php namespace app\validate; use think\Validate; class Staff extends Validate { //创建验证规则 //以属性的方式进行配置,属性不能更改 protected $rule = [ 'name'=>'require|min:5|max:15', //最少5,最大15 'sex' => 'in:0,1', 'age' => 'require|between:18,60', 'salary' => 'require|gt: 1500' ]; //错误信息可以自定义: protected $message = [ 'name.require' => '姓名不能为空', 'name.min' => '姓名不能少于5个字符', 'name.max' => '姓名不能大于15个字符', 'sex.in' => '请选择性别', 'age.require' => '年龄必须输入', 'age.between' => '年龄必须在18到60周岁之间', 'salary.require' => '工资必须输入', 'salary.gt' => '工资必须大于3000元' ]; }