模型自动操作与数据验证小结

原创 2018-11-28 15:14:10 327
摘要:一、获取器的创建与使用1.获取是写在模型类中的一个方法,获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public类型)2.当用户通过模型获取表中数据时会自动触发,但也并非绝对如此3.主要应用场景:用于从数据表中读取数据 (1)时间日期字段的格式化输出; (2)集合或枚举类型的输出; (3)数字状态字段的输出; (4)组合字段的输出4. 获取器方

一、获取器的创建与使用

1.获取是写在模型类中的一个方法,获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public类型)

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

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

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

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

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

(4)组合字段的输出

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

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

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

<?php
class User extends Model 
{
    protected function getSexAttr($value)
    {	$sex = [0=>'男', 1=>'女'];
    	return $sex[$value];
    }
}
// 控制器代码
$res = User::get(1);
echo $res->sex, '<br>'; //查看经过修改器处理后的性别字段,男

二、修改器的创建与使用

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

2.使用场景:

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

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

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

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

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

(1)模型对象赋值;

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

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

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

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

<?php
class User extends Model {
    protected function setEntryTimeAttr($value)
    {
    	return strtotime($value);
    }
}
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 '修改成功';
	}


三、自动完成

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

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

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

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

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

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

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

//自动完成,模型中
    protected $insert = ['sex' => 0,'salary'=> 1000]; //新增时
    protected $update = ['sex'=> 0];
//自动完成:控制器
	public function auto()
	{
		Staff::create(['name'=>'ma','age'=>18]);
	}

四、数据验证技术

有二种方式:

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

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


--- 验证器

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

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

<?php 
namespace app\index\controller;

use think\Controller;
use app\validate\User; //导入验证器
use think\Validate;
class Verify extends Controller
{
	//验证器: 直接实例化验证器完成验证
	public function demo1()
	{
		//准备要验证的数据
		$data = [
			'name'=>'ma',
			'sex' => 3,
			'age' => 15,
			'salary' => 1200
		];

		$validate = new Staff();
		if (!$validate->check($data)) {
			dump($validate->getError());
		} else {
			return '验证通过';
		}
	}

	//验证器: 使用控制器内容的验证对象来完成验证: $this->validate($data, $rule)
	public function demo2()
	{
		//准备要验证的数据
		$data = [
			// 'name'=>'zhu',
			'name'=>'ma',
			'sex' => 0,
			'age' => 2225,
			'salary' => 1600
		];

		$rule = 'app\validate\Staff';
		$rule = [
			'age' => 'between:10,50',
		];
		$message = [
			'age.between' => '年龄必须在10到50之间'
		];
		$data = ['age'=>8];
		// $res = $this->validate($data,$rule);
		$res = $this->validate($data,$rule,$message);
		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:20,60'
		];

		//2.创建错误信息
		$mess = [
			'age.require' => '年龄必须填写',
			'age.between' => '年龄必须在20到60之间'
		];

		//3.创建验证数据
		$data = ['age' => 13];

		//初始化验证器类,并返回验证器实例
		$validate = Validate::make($rule, $mess);

		$res = $validate->check($data);

		return $res ? '验证通过' : $validate->getError();
	}
}


批改老师:天蓬老师批改时间:2018-11-28 15:17:50
老师总结:获取器,设置器,是所有框架都会提供一个基本功能, 要注意这二个方法要与自动完成属性配合使用

发布手记

热门词条