thinkphp 前置函数参数问题

public function _before_insert(&$data,$option)

$data 相当于create获取的值

public function _after_insert($data,$options)

$data 相当于create获取后的值

public function _before_update(&$data, $options)


public function _before_delete($option)

在Library/Think/Model.class.php 这个基础model类中在添加add,修改save,和删除delete 时各自回调用两个回调函数. 使用这两个回调函数会给开发带来方便.
1 . add()方法回调函数

  1.     // 插入数据前的回调方法
  2.     protected function _before_insert(&$data,$options) {}
  3.     // 插入成功后的回调方法
  4.     protected function _after_insert($data,$options) {}
  5. /code]
  6. 2 . save()方法回调函数.[code] // 更新数据前的回调方法
  7.     protected function _before_update(&$data,$options) {}
  8.     // 更新成功后的回调方法
  9.     protected function _after_update($data,$options) {}
复制代码
3 .delete()方法回调方法
  1.     // 删除数据前的回调方法
  2.     protected function _before_delete($options) {}    
  3.     // 删除成功后的回调方法
  4.     protected function _after_delete($data,$options) {}
复制代码
使用场景是什么?
1 ._before_insert()
  1. protected function _before_insert(&$data, $option)
  2.     {
  3.         // 添加管理员之前先加密
  4.         $data['password'] = md5($data['password'] . C('MD5_KEY'));
  5.     }
复制代码

上面就是我们在插入数据库之前,对password字段进行md5加密.
格式必须是 $data['字段名'] . 这个字段名就是你要插入到数据表中的字段.

2 ._after_insert()
  1.     // 添加后
  2.     protected function _after_insert($data, $option)
  3.     {
  4.         // 处理管理员所在角色
  5.         $roleId = I('post.role_id');
  6.         if($roleId)
  7.         {
  8.             $raModel = M('RoleAdmin');
  9.             foreach ($roleId as $k => $v)
  10.             {
  11.                 $raModel->add(array(
  12.                     'admin_id' => $data['id'], // 添加之后的管理员的ID
  13.                     'role_id' => $v,
  14.                 ));
  15.             }
  16.         }
  17.     }
复制代码
上面是定义在管理员模型中的方法 . 它的html页面是添加管理员的同时给管理员分配角色 . 所以收集到的表单中有 有admin表的信息以及role_id . 上面代码实现的是 向 admin_role 这个中间表中插入数据, 此时role_id 可以通过表单提交收集到, 但是缺少admin_id .
这个admin_id 就是 $data['admin表的主键']
3 ._before_update
  1.     // 修改前
  2.     protected function _before_update(&$data, $option)
  3.     {
  4.         // 处理管理员所在角色
  5.         // 先删除中间表中原来的数据
  6.         $raModel = M('RoleAdmin');
  7.         $raModel->where(array(
  8.             'admin_id' => $option['where']['id'],
  9.         ))->delete();
  10.         // 重新把新选择的添加一遍
  11.         $roleId = I('post.role_id');
  12.         if($roleId)
  13.         {
  14.             foreach ($roleId as $k => $v)
  15.             {
  16.                 $raModel->add(array(
  17.                     'admin_id' => $option['where']['id'], // 添加之后的管理员的ID
  18.                     'role_id' => $v,
  19.                 ));
  20.             }
  21.         }
  22.         // 判断如果密码为空就不修改密码【从表单数组中把这一项删除】
  23.         if(empty($data['password']))
  24.             unset($data['password']);
  25.         else 
  26.             $data['password'] = md5($data['password'] . C('MD5_KEY'));
  27.     }
复制代码
这里有两点.
第一:如果你需要在修改前对数据进行处理.
格式 仍然是 $data['字段']
  1. $data['password'] = md5($data['password'] . C('MD5_KEY'));
复制代码
第二:如果你要先中间表中插入数据,缺少的admin_id 此时是$options['where']['主键']
4 ._after_update
$options['where']['主键']
5 . _before_delete
  1.     // 删除前
  2.     protected function _before_delete($option)
  3.     {
  4.         if($option['where']['id'] == 1)
  5.         {
  6.             $this->error = '超级管理员不能被删除!';
  7.             return FALSE;
  8.         }
  9.         // 把中间表中对应的数据也删除
  10.         $raModel = M('RoleAdmin');
  11.         $raModel->where(array(
  12.             'admin_id' => array('eq', $option['where']['id']),
  13.         ))->delete();
  14.     }
复制代码
$option['where']['主键']
总结:
1 . 在insert 中如果想要获得主键,就是$data['主键'] ,例如$data['id']
2 .在update,delete 想要获得主键就是$options['where']['主键']

如果在这些回调方法中出现错误,怎们处理
  1. protected function _before_delete($option)
  2.     {
  3.         if($option['where']['id'] == 1)
  4.         {
  5.             $this->error = '超级管理员不能被删除!';
  6.             return FALSE;
  7.         }
复制代码
将错误赋值给 模型中的error变量, 同时返回false. 
这样这个错误,就就可以用模型的getError()方法获取了.
Model.class.php中的getError()方法
  1.     /**
  2.      * 返回模型的错误信息
  3.      * @access public
  4.      * @return string
  5.      */
  6.     public function getError(){
  7.         return $this->error;
  8.     }
复制代码
查看Model.class.php中的源码.
add方法
  1.     public function add($data='',$options=array(),$replace=false) {
  2.         if(empty($data)) {
  3.             // 没有传递数据,获取当前数据对象的值
  4.             if(!empty($this->data)) {
  5.                 $data           =   $this->data;
  6.                 // 重置数据
  7.                 $this->data     = array();
  8.             }else{
  9.                 $this->error    = L('_DATA_TYPE_INVALID_');
  10.                 return false;
  11.             }
  12.         }
  13.         // 分析表达式
  14.         $options    =   $this->_parseOptions($options);
  15.         // 数据处理
  16.         $data       =   $this->_facade($data);
  17.       A处:  if(false === $this->_before_insert($data,$options)) {
  18.             return false;
  19.         }
  20.         // 写入数据到数据库
  21.         $result = $this->db->insert($data,$options,$replace);
  22.         if(false !== $result ) {
  23.             $insertId   =   $this->getLastInsID();
  24.             if($insertId) {
  25.                 // 自增主键返回插入ID
  26.                 $data[$this->getPk()]  = $insertId;
  27.            B处:     $this->_after_insert($data,$options);
  28.                 return $insertId;
  29.             }
  30.             $this->_after_insert($data,$options);
  31.         }
  32.         return $result;
  33.     }
复制代码
上面A处时调用_before_insert. 这里是判断是否是false, 如果是false ,add()方法也返回false . 所以这就就是我们在_before_insert中出现错误的时候要返回false的原因
B处前一行代码,可以看出在插入数据后,将最新的主键保存到了$data['主键']中.

save()方法:
  1.     public function save($data='',$options=array()) {
  2.         if(empty($data)) {
  3.             // 没有传递数据,获取当前数据对象的值
  4.             if(!empty($this->data)) {
  5.                 $data           =   $this->data;
  6.                 // 重置数据
  7.                 $this->data     =   array();
  8.             }else{
  9.                 $this->error    =   L('_DATA_TYPE_INVALID_');
  10.                 return false;
  11.             }
  12.         }
  13.         // 数据处理
  14.         $data       =   $this->_facade($data);
  15.         // 分析表达式
  16.         $options    =   $this->_parseOptions($options);
  17.         $pk         =   $this->getPk();
  18.         if(!isset($options['where']) ) {
  19.             // 如果存在主键数据 则自动作为更新条件
  20.             if(isset($data[$pk])) {
  21.              A处:   $where[$pk]         =   $data[$pk];
  22.                 $options['where']   =   $where;
  23.                 unset($data[$pk]);
  24.             }else{
  25.                 // 如果没有任何更新条件则不执行
  26.                 $this->error        =   L('_OPERATION_WRONG_');
  27.                 return false;
  28.             }
  29.         }
  30.      B处:   if(is_array($options['where']) && isset($options['where'][$pk])){
  31.             $pkValue    =   $options['where'][$pk];
  32.         }        
  33.         if(false === $this->_before_update($data,$options)) {
  34.             return false;
  35.         }        
  36.         $result     =   $this->db->update($data,$options);
  37.         if(false !== $result) {
  38.             if(isset($pkValue)) $data[$pk]   =  $pkValue;
  39.             $this->_after_update($data,$options);
  40.         }
  41.         return $result;
  42.     }
复制代码
如果你使用了连贯操作,直接到B处. 
如果没有使用连贯操作,从A处,将主键保存到$option['where']['主键'],同时删除了$data['主键']



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值