用thinkphp的时候create方法与 add方法是非常通用的了、那么今天顺着thinkphp的流程来看一下这两个方法在thinkphp框架中是怎么运行的
测试代码:
public function D(){ $test = D('test'); if($test->create()){ $test->add(); }else{ exit($test->getError()); } }
数据表结构为
CREATE TABLE `test` ( `id` int(10) NOT NULL, `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这是一个非常简单的增加操作了、create验证数据信息、add方法增加操作,还有一个form表单也暂且不贴了。
首先实例化Model
/** +---------------------------------------------------------- * D函数用于实例化Model 格式 项目://分组/模块 +---------------------------------------------------------- * @param string name Model资源地址 +---------------------------------------------------------- * @return Model +---------------------------------------------------------- */ function D($name='') { if(empty($name)) return new Model; static $_model = array(); if(isset($_model[$name])) return $_model[$name]; if(strpos($name,'://')) {// 指定项目 $name = str_replace('://','/Model/',$name); }else{ $name = C('DEFAULT_APP').'/Model/'.$name; } import($name.'Model'); $class = basename($name.'Model'); if(class_exists($class)) { $model = new $class(); }else { $model = new Model(basename($name)); } $_model[$name] = $model; return $model; }
根据传递参数构造路径import后实例化model类、返回model对象
$test->create(),create代码
Thinkphp/Lib/Core/Model.class.php /** +---------------------------------------------------------- * 创建数据对象 但不保存到数据库 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param mixed $data 创建数据 * @param string $type 状态 +---------------------------------------------------------- * @return mixed +---------------------------------------------------------- */ public function create($data='',$type='') { // 如果没有传值默认取POST数据、$data为对象则取对象属性作为参数 if(empty($data)) { $data = $_POST; }elseif(is_object($data)){ $data = get_object_vars($data); } // 验证数据、空或者不为数组返回false、将最近报错信息赋值 if(empty($data) || !is_array($data)) { $this->error = L('_DATA_TYPE_INVALID_'); return false; } // 检查字段映射、开启映射则将数据映射、没开启则返回$data $data = $this->parseFieldsMap($data,0); // 状态 $type = $type?$type:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT); // 数据自动验证(进行设置的验证规则进行验证、无规则不验证) if(!$this->autoValidation($data,$type)) return false; // 表单令牌验证、开启令牌验证则进行验证 if(C('TOKEN_ON') && !$this->autoCheckToken($data)) { $this->error = L('_TOKEN_ERROR_'); return false; } // 验证完成生成数据对象 if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据 $vo = array(); foreach ($this->fields as $key=>$name){ if(substr($key,0,1)=='_') continue; $val = isset($data[$name])?$data[$name]:null; //保证赋值有效 if(!is_null($val)){ $vo[$name] = (MAGIC_QUOTES_GPC && is_string($val))? stripslashes($val) : $val; } } }else{ $vo = $data; } // 创建完成对数据进行自动处理 $this->autoOperation($vo,$type); // 赋值当前数据对象 $this->data = $vo; // 返回创建的数据以供其他调用 return $vo; }
$test->add();
Thinkphp/Lib/Core/Model.class.php /** +---------------------------------------------------------- * 新增数据 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param mixed $data 数据 * @param array $options 表达式 * @param boolean $replace 是否replace +---------------------------------------------------------- * @return mixed +---------------------------------------------------------- */ public function add($data='',$options=array(),$replace=false) { if(empty($data)) { // 没有传递数据,获取当前数据对象的值 if(!empty($this->data)) { $data = $this->data; // 重置数据 $this->data = array(); }else{ $this->error = L('_DATA_TYPE_INVALID_'); return false; } } // 分析表达式 $options = $this->_parseOptions($options); // 数据处理 $data = $this->_facade($data); if(false === $this->_before_insert($data,$options)) { return false; } // 写入数据到数据库 $result = $this->db->insert($data,$options,$replace); if(false !== $result ) { $insertId = $this->getLastInsID(); if($insertId) { // 自增主键返回插入ID $data[$this->getPk()] = $insertId; $this->_after_insert($data,$options); return $insertId; } } return $result; }
基本的操作位处理数据、插入到数据库、查询最新的插入id、插入id当做键
文章均属 松林's blog 原创 转载请注明转自 松林's blog
本文地址 : http://www.songlin51.com/archives/1162.html