模型控制
发布时间: 2014-04-04 15:35 浏览:9235
一:自动验证
类型检查只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能来完成模型的业务规则验证,而大多数情况下面,数据对象是由表单提交的$_post数据创建。需要使用系统的自动验证功能,只需要在model类里面定义$_validate属性,是由多个验证因子组成的数组,支持的验证因子格式:
array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间)
验证字段:需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等。(必须)
验证规则: 要进行验证的规则,需要结合附加规则(必须)
提示信息: 用于验证失败后的提示信息定义(必须)
验证条件:(可选)
model::exists_to_vailidate 或者0 存在字段就验证 (默认)
model::must_to_validate 或者1 必须验证
model::value_to_vailidate或者2 值不为空的时候验证
附加规则: 配合验证规则使用(可选),包括:
regex 使用正则进行验证,表示前面定义的验证规则是一个正则表达式(默认)
function 使用函数验证,前面定义的验证规则是一个函数名
callback 使用方法验证,前面定义的验证规则是当前model类的一个方法
confirm 验证表单中的两个字段是否相同,前面定义的验证规则是一个字段名
equal 验证是否等于某个值,该值由前面的验证规则定义
in 验证是否在某个范围内,前面定义的验证规则必须是一个数组
unique 验证是否唯一,系统会根据字段目前的值查询数据库来判断是否存在相同的值
系统还内置了一些常用正则验证的规则,可以直接使用,包括:require 字段必须、email 邮箱、url url地址、currency 货币、number 数字,这些验证规则可以直接使用。
验证时间:(可选)
model:: model_insert 或者1新增数据时候验证
model:: model_update 或者2编辑数据时候验证
model:: model_both 或者3 全部情况下验证(默认)
示例:
protected $_validate = array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,’unique’,1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,’in’), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,’confirm’), // 验证确认密码是否和密码一致
array('password','checkpwd','密码格式不正确',0,’function’), // 自定义函数验证密码格式
);
当使用系统的create方法创建数据对象的时候会自动进行数据验证操作,代码示例:
$user = d("user"); // 实例化user对象
if (!$user->create()){
// 如果创建失败 表示验证没有通过 输出错误提示信息
exit($user->geterror());
}else{
// 验证通过 可以进行其他数据操作
}
(2)自动完成
在model类定义 $_auto 属性,可以完成数据自动处理功能,用来处理默认值、数据过滤以及其他系统写入字段。$_auto属性是由多个填充因子组成的数组,填充因子定义格式:
array(填充字段,填充内容,填充条件,附加规则)
填充字段就是需要进行处理的表单字段,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等。
填充条件包括:
model:: model_insert 或者1 新增数据的时候处理(默认)
model:: model_update 或者2更新数据的时候处理
model:: model_both 或者3所有情况都进行处理
附加规则包括:
function :使用函数,表示填充的内容是一个函数名
callback :回调方法 ,表示填充的内容是一个当前模型的方法
field :用其它字段填充,表示填充的内容是一个其他字段的值
string :字符串(默认方式)
示例:
protected $_auto = array (
array('status','1'), // 新增的时候把status字段设置为1
array('password','md5',1,'function') , // 对password字段在新增的时候使md5函数处理
array('name','getname',1,'callback'), // 对name字段在新增的时候回调getname方法
array('create_time','time',2,’function’), // 对create_time字段在更新的时候写入当前时间戳
);
(3)视图模型关联查询
要定义视图模型,只需要继承viewmodel,然后设置viewfields属性即可。例如下面的例子,我们定义了一个blogview模型对象,其中包括了blog模型的id、name、title和user模型的name,以及category模型的title字段,我们通过创建blogview模型来快速读取一个包含了user名称和类别名称的blog记录(集)。
class blogviewmodel extends viewmodel
{
public $viewfields = array(
'blog'=>array('id','name','title'),
'category'=>array('title'=>'category_name', '_on'=>'blog.category_id=category.id'),
'user'=>array('name'=>'username', '_on'=>'blog.user_id=user.id'),
);
}
调用方法: d('blogview')
(4)关联模型
通常我们所说的关联关系包括下面三种:
² 一对一关联 :one_to_one,包括has_one 和 belongs_to
² 一对多关联 :one_to_many,包括has_many 和 belongs_to
² 多对多关联 :many_to_many
关联关系必然有一个参照表,例如:
有一个员工档案管理系统项目,这个项目要包括下面的一些数据表:基本信息表、员工档案表、部门表、项目组表、银行卡表(用来记录员工的银行卡资料)。
这些数据表之间存在一定的关联关系,我们以员工基本信息表为参照来分析和其他表之间的关联:
每个员工必然有对应的员工档案资料,所以属于has_one关联;
每个员工必须属于某个部门,所以属于belongs_to关联;
每个员工可以有多个银行卡,但是每张银行卡只可能属于一个员工,因此属于has_many关联;
每个员工可以同时在多个项目组,每个项目组同时有多个员工,因此属于many_to_many关联;
分析清楚数据表之前的关联关系后,我们才可以进行关联定义和关联操作。
关联定义:
class usermodel extends relationmodel
{
public $_link = array(
'profile'=>array(
'mapping_type' =>has_one, //关联类型
'class_name' =>'profile', //关联模型的类名
// 定义更多的关联属性
……
),
);
}
关联操作
除了关联查询外,系统也支持关联数据的自动写入、更新和删除
关联写入
$user = d("user");
$data = array();
$data["account"] = "thinkphp";
$data["password"] = "123456";
$data["profile"] = array(
'email' =>'liu21st@gmail.com',
'nickname' =>'流年',
);
$result = $user->relation(true)->add($user);
这样就会自动写入关联的profile数据。
同样,可以使用参数来控制要关联写入的数据:
$result = $user->relation("profile")->add($user);
关联更新
数据的关联更新和关联写入类似
$user = d("user");
$data["account"] = "thinkphp";
$data["password"] = "123456";
$data["profile"] = array(
'email' =>'liu21st@gmail.com',
'nickname' =>'流年',
);
$result = $user-> relation(true)->where(‘id=3’)->save($data);
relation(true)会关联保存user模型定义的所有关联数据,如果只需要关联保存部分数据,可以使用:
$result = $user->relation("profile")->save($data);
这样就只会同时更新关联的profile数据。
关联保存的规则:
has_one 关联数据的更新直接赋值
has_many 的关联数据如果传入主键的值 则表示更新 否则就表示新增
many_to_many 的数据更新是删除之前的数据后重新写入
关联删除
删除用户id为3的记录的同时删除关联数据
$result = $user->relation(true)->delete("3");
如果只需要关联删除部分数据,可以使用
$result = $user->relation("profile")->delete("3");