自动完成
ThinkPHP 模型层提供的数据处理方法,主要用于数据的自
动处理和过滤,使用 create()方法创建数据是会自动完成。
一. 完成规则
自动完成一般通过默认字段写入、安全字段过滤以及业务逻辑的自动处理等。有两种方
式实现自动完成的规则:1.静态方式:在模型类里通过$_auto 属性定义处理规则;2 动态
方式:使用模型类的 auto 方法动态创建自动处理规则。
1 //完成规则 2 array( 3 array(完成字段1,完成规则,[完成条件,附加规则]), 4 array(完成字段2,完成规则,[完成条件,附加规则]), 5 ...... 6 );
完成字段:必填,需要的字段名;
完成规则:必填,配合附加规则完成;
完成条件:可选,具体如下:
1.self::MODEL_INSERT 或 1,新增数据的时候处理(默认);
2.self::MODEL_UPDATE 或 2,更新数据的时候处理;
3.self::MODEL_BOTH 或 3,所有情况均处理。
附加规则:可选,配合完成规则使用,包括一下规则:
规则 | 说明 |
function | 函数完成,定义的验证规则是一个函数名 |
callback | 方法完成,定义的验证规则是当前模型类的一个方法 |
field | 用其他字段填充,表示填充的内容是一个其他字段的值 |
string | 字符串(默认) |
ignore | 为空则忽略(3.1.2新增) |
二. 静态定义
在模型类里预先定义好该模型的自动完成规则,就是静态定义。
在 Home/controller/UserController.class.php 里插入以下代码:
1 public function add() { 2 $user=D('User'); 3 $data['user']='蜡笔大新'; 4 $data['email']='bbb@qq.com'; 5 if($user->create($data)) { 6 $user->add(); 7 } 8 }
注意一下的是: $user->add(); 里不再需要加上$data了否则后面的功能就实现不了了。
然后在 Home/Model/UserModel.class.php 插入以下代码:
1 <?php 2 namespace Home\Model; 3 use Think\Model; 4 5 class UserModel extends Model { 6 protected $_auto = array( 7 array('count','1'), 8 array('user','sha1',3,'function'), 9 ); 10 }
这时当执行 Home/controller/UserController.class.php 的add()函数时,添加到数据库的数据中的count下的数值会自动加一,同时user会使用sha1加密,
array('user','sha1',3,'function'), 中使用了function,当并没有在conmon文件夹下的common下建立function.php,并在其中建立function sha1函数,
是因为sha1加密函数是ThinkPHP自带的,已经封装好了,md5加密方式也是。
还有诸如:
1 array('user','email',3,'field'),
是把email写入到用户名中。
callback,给用户名加前缀
这时就是当添加用户名到数据库时,给上传的用户名加上前缀
在 Home/controller/UserController.class.php 下插入:
1 public function add() { 2 $user=D('User'); 3 $data['id']=12; 4 $data['user']='dedede'; 5 $data['email']='dead@qq.com'; 6 if($user->create($data)) { 7 $user->add(); 8 } 9 }
然后在 Home/Model/UserModel.class.php 中插入:
1 <?php 2 namespace Home\Model; 3 use Think\Model; 4 5 class UserModel extends Model { 6 protected $_auto = array( 7 array('user','updateUser','3','callback','_'),//'_'即为updateUser($str,$prefix)中的$prefix 8 ); 9 10 protected function updateUser($str,$prefix) { 11 return $prefix.$str; 12 } 13 }
这时每次往数据库插入一条数据,都会在user下的用户名前加上'_'
1 //ignore,用于修改时密码留空时,忽略修改 2 array('password', '', 2, 'ignore'),
这是在 Home/controller/UserController.class.php 中当提交的时候用户名为空时,则忽略掉不改变数据库中的用户名,只改变密码就好了。
三. 动态完成
动态完成就是把完成的规则放在控制器端,这样,在操作的时候比较灵活,缺点就是比较混乱
1 public function add() { 2 $rules=array( 3 array('user','sha1',3,'function'), 4 ); 5 $user=M('User'); 6 $data['user']='蜡笔小新'; 7 if($user->auto($rules)->create($data)) { 8 $user->add(); 9 } 10 }
需要注意的是在得到添加的数据时,auto前面不要加$符号。