模型自动操作与数据验证

原创 2018-11-25 18:56:32 346
摘要:一、获取器的创建与使用1.获取是写在模型类中的一个方法2.当用户通过模型获取表中数据时会自动触发,但也并非绝对如此3.主要应用场景:用于从数据表中读取数据 (1)时间日期字段的格式化输出; (2)集合或枚举类型的输出; (3)数字状态字段的输出; (4)组合字段的输出4. 获取器方法命名规则: get字段名Attr(字段值[,所有字段]),例如 getBirthdayAttr($value)5.

一、获取器的创建与使用

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. 类似于给表中字段设置默认值

///////////////////////////////////////////////////////示例代码////////////////////////////////////////////////////////////////////////////////////

<?php

namespace app\index\model;

/**

* 实现软删除功能的步骤

* 1.在数据表中新增delete_time字段(字段名可自定义)

* 2.在模型中导入trait类:SoftDelete

* 3.设置模型属性 protected $deleteTime = '删除时间字段名';

* 4.设置软删除字段默认值[可选]

*/

use think\Model;

//使用软删除功能,必须先导入model/concern/SoftDelete.php

use think\model\concern\SoftDelete;    //实际上一个trait方法集

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];

}

//thinkphp5.1的表单验证

数据验证技术

为什么要验证?

用户提交的请求数据,以及要写到数据表的数据,必须是符合要求的,安全的,所以,对于外部提交的数据,必须进

行验证,这是Web开发的第一原则.永远不要相信用户,这是我们开发者的底钱,指望用户自律,无异于与虎谋皮

有二种方式:

1.验证器类: 创建与模型对象的验证器类,类文件与位置都可以自定义,建议验证器名与模型同名

2.独立验证: 实例化框架的think\Validate.php

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

一、验证器

1. 在application下创建validate目录,并创建一个与staff表同名的类文件: Staff.php

2. application/validate/Staff.php: 就是我们要创建的验证器类


批改老师:天蓬老师批改时间:2018-11-25 19:40:20
老师总结:总结的非常到位, 在TP51中,验证操作使用非常多,因此控制器还内容一个快捷方法. 还有, 模型中的获取和设置器,要与自动完成属性配对使用

发布手记

热门词条