作业:获取器,修改器,验证等

原创 2018-11-18 22:10:49 289
摘要:model/Staff.phpclass Staff extends Model { use SoftDelete;     //设置数据表名     protected $table = 'staff';  &nbs

model/Staff.php

class Staff extends Model
{
	use SoftDelete;

    //设置数据表名
    protected $table = 'staff';

    //设置主键
    protected $pk = 'staff_id';

    //设置删除时间字段,配合软删除功能
    protected $deleteTime = 'delete_time';

    //设置软删除字段的默认值
    protected $defaultSoftDelete = 0;

    //获取器1: sex字段,仅限模型内部调用,不能是public
    protected function getSexAttr($value)
    {	$sex = [0=>'男', 1=>'女'];
    	return $sex[$value];
    }

    //获取器2: 可传入所有字段的值,用来更加完整的描述用户字段信息
    protected function getSalaryAttr($value, $data)
    {
    	return $data['name'].'的工资是:'.($value+200);  //生成用户订单是常用
    }
    
    //获取器3: 可以为表中不存在的字段设置获取器方法,纯粹为了拼装字段内容
    protected function getStaffInfoAttr($value, $data)
    {
    	//其实$value此时仅是一个占位符,可任意命名,无任何意义
    	return '我是'.$data['name'].'今年都.'.$data['age'].'岁了,工资才'.$data['salary'].',好可怜呀~~';
    }

    //修改器1:将入职时间自动转为时间戳存储
    protected function setEntryTimeAttr($value)
    {
    	return strtotime($value);
    }
    //修改器2:也支持传入第二个参数,引用其它字段的值
    protected function setSalaryAttr($value, $data)
    {	
    	//salary字段存入表中时,自动加上员工的年龄,纯粹演示,无实际意义
    	return $value+$data['age']; 
    }

    //开启当前模型的自动时间戳功能
    protected $autoWriteTimestamp = true;
    //设置支持自动时间戳功能的字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';


    //类型转换
    //思考:为什么name字段不需要转换
    //因为从表中取出的数据默认都是字符型,name本身就是字符型,所以不用转换
    protected $type = [
        'staff_id'    =>  'integer',
        'sex'     =>  'integer',
        'age'  =>  'interger',
        'salary'      =>  'interger',
    ];

    //自动完成
    protected $insert = ['sex' => 0,'salary'=> 1000]; //新增时
    protected $update = ['sex'=> 0];
    // protected $auto = ['sex'=>0];


    


}

Controller\ModelEdu.php

<?php 
namespace app\index\controller;
use think\Controller;
use app\index\model\Staff;
class ModelEdu extends Controller
{
	//获取器
	public function gain()
	{
		$res = Staff::get(2);  //实例并初始化Staff模型
		\var_dump($res);  //查看所有字段信息
		echo $res->sex, '<br>';  //查看经过修改器处理后的性别字段
		echo $res->getData('sex'), '<br>'; //查看原始字段值
		echo $res->salary, '<br>'; ////查看经过修改器处理后的工资字段(为了保密加了200,非真实工资)
		echo  $res->staff_info, '<br>'; //查看一个不存在的字段信息,体验获取器的强大之处
	}

	//修改器: 先给staff表新增一个字段entry_time: 入职时间
	public function modify()
	{
		$res = Staff::get(3);
		$res->entry_time = '2015-05-22';
		// $res->save();

		$res = Staff::get(3);
		$res->salary = 7800;
		$res->save();
		return '修改成功';
	}

	//自动完成:
	public function auto()
	{
		Staff::create(['name'=>'灭绝师太','age'=>59]);
	}
}

总结:

一、获取器的创建与使用

1.获取是写在模型类中的一个方法

2.当用户通过模型获取表中数据时会自动触发,但也并非绝对如此

3.主要应用场景:用于从数据表中读取数据

(1)时间日期字段的格式化输出;

(2)集合或枚举类型的输出;

(3)数字状态字段的输出;

(4)组合字段的输出

4. 获取器方法命名规则: 

get字段名Attr(字段值[,所有字段]),例如 getBirthdayAttr($value)

5. 可以读取不存在的字段信息


--------------------------------------------------------------------------------


二、修改器的创建与使用

1.修改器也是模型类中的一个方法

2.使用场景:

(1)时间日期字段的转换写入;

(2)集合或枚举类型的写入;

(3)数字状态字段的写入;

(4)某个字段涉及其它字段的条件或者组合写入

2.在以下5种情况下会触发修改器工作

(1)模型对象赋值;

(2)调用模型的data方法,并且第二个参数传入true;

(3)调用模型的save方法,并且传入数据;

(4)显式调用模型的setAttr方法;

(5)定义了该字段的自动完成;


--------------------------------------------------------------------------------


三、自动时间戳

1.添加与更新数据时,将时间自动写入到指定字段中

2.可以全局开启,也可以在模型中单独开启

(1)全局设置:config/database.php

  // 自动写入时间戳字段

    'auto_timestamp'  => false, //改为true

    如果当前模型中不需要自动时间戳功能,请手动关闭

    protected $autoWriteTimestamp = false;

(2)模型设置:

protected $autoWriteTimestamp = true;

**建议在模型中单独开启,这样最灵活,毕竟不是每一张表都需要时间戳字段

3.一旦开启该功能,用户更新或添加数据时会自动将操作时间写入到以下二个字段

(1)新增时间: create_time

(2)更新时间: update_time

以上这二个字段名是默认值,可以在模型中重新定义

4.不需要为这二个字段设置修改器,框架会自动处理


--------------------------------------------------------------------------------


三、类型转换

1.表中取出的数据,默认为字符类型

2.在模型中配置: protected $type = ['字段名' => '类型名称',...]

3.类型中没有字符型,因为它是默认类型,无须转换

--------------------------------------------------------------------------------


四、自动完成

1. 自动完成必须要配合修改器工作;

2. 自动完成是针对写操作: 新增与更新

3. 通过在模型中设置三个属性来配置

4. protected $insert = []; 新增时自动完成

5. protected $update = []; 更新时自动完成

6. protected $auto = []; 新增或更新时自动完成

7. 类似于给表中字段设置默认值

---------------------------------------

验证:

validate\Staff.php

<?php
namespace app\validate;
use think\Validate;
class Staff extends Validate{
	//创建验证规则
	//以属性的方式进行配置,属性不能更改
	protected $rule=[
		'name'=>'require|min:5|max: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'=>'工资必须大于1500'
	];
}

?>

Controller\Verify.php

<?php
namespace app\index\controller;
use think\Controller;
use app\validate\Staff;
use think\Validate;
class Verify extends Controller{
	public function demo1(){
		$data=[
			'name'=>'laoshi',
			'sex'=>1,
			'age'=>18,
			'salary'=>1700
		
		];
		$validate=new Staff();
		if(!$validate->check($data)){
			dump($validate->getError());
		}else{
			return '验证通过';
		}
		
	}
	
}

?>


批改老师:天蓬老师批改时间:2018-11-19 09:10:07
老师总结:很好, 获取器和修改器,要配合自动完成属性来用的

发布手记

热门词条