thinkphp自动创建数据对象解析

thinkphp有一个自动创建数据对象的create方法,核心代码如下

   public function create($data=‘‘,$type=‘‘) {
      // 如果没有传值默认取POST数据
      if(empty($data)) {
          $data   =   I(‘post.‘);
      }elseif(is_object($data)){
          $data   =   get_object_vars($data);
      }
      // 判断是否有主键,有代表修改,没有代表插入
      $type = $type?:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT);

      // 生成数据对象,先获取该模型所有的字段$fields,过滤掉$data中不在field数据中的字段(最后剩下表中存在的字段)
      if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据
          $fields =   $this->getDbFields();
          foreach ($data as $key=>$val){
              if(!in_array($key,$fields)) {
                  unset($data[$key]);
              }elseif(MAGIC_QUOTES_GPC && is_string($val)){
                  $data[$key] =   stripslashes($val);
              }
          }
      }

      $this->data =   $data;
      return $data;
   }

 其中$this->getDbFields方法如下,该方法返回对应表字段名组成的索引数组

  /**
   * 获取数据表字段信息
   * @access public
   * @return array
   */
  public function getDbFields(){
      if(isset($this->options[‘table‘])) {// 动态指定表名
          $array      =   explode(‘ ‘,$this->options[‘table‘]);
          $fields     =   $this->db->getFields($array[0]);
          return  $fields?array_keys($fields):false;
      }
      if($this->fields) {
          $fields     =  $this->fields;
          unset($fields[‘_type‘],$fields[‘_pk‘]);
          return $fields;
      }
      return false;
  }

 $this->db->getFields方法如下,该方法返回对应表的字段详细信息

  public function getFields($tableName) {
      $result =   $this->query(‘SHOW COLUMNS FROM ‘.$this->parseKey($tableName));
      $info   =   array();
      if($result) {
          foreach ($result as $key => $val) {
              $info[$val[‘Field‘]] = array(
                  ‘name‘    => $val[‘Field‘],
                  ‘type‘    => $val[‘Type‘],
                  ‘notnull‘ => (bool) (strtoupper($val[‘Null‘]) === ‘NO‘), // not null is empty, null is yes
                  ‘default‘ => $val[‘Default‘],
                  ‘primary‘ => (strtolower($val[‘Key‘]) == ‘pri‘),
                  ‘autoinc‘ => (strtolower($val[‘Extra‘]) == ‘auto_increment‘),
              );
          }
      }
      return $info;
  }
时间: 2024-09-29 22:23:35

thinkphp自动创建数据对象解析的相关文章

ThinkPHP 自动创建数据、自动验证、自动完成详细例子介绍(十九)

原文:ThinkPHP 自动创建数据.自动验证.自动完成详细例子介绍(十九) 1:自动创建数据 //$name=$_POST['name']; //$password=$_POST['password'];  ---这个注册页面传过来的POST值 下面用了自动穿件create方法就可以不用这个,会行动绑定 $user =M('User'); $User->create();   //会将传过来的$_POST数据对应到数据库的字段 $user->add();   //就可以直接写入 2:自动验证

创建数据对象

创建数据对象 1.为什么要创建数据对象 在实际项目开发中,经常要接收表单数据,如果表单数据过多,我们在接收过程中就需要通过$_POST进行多次接收,为了简化以上操作,我们就可以使用数据对象来解决这个问题. ? ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显. 2.模拟创建数据对象 ① 更改add.html模板页面中的表单数据 ② 设置下拉选框 在控制器的add方法中定义如下: 在模板中通过volist

SpringBoot+Mybatis 自动创建数据表(适用mysql)

Mybatis用了快两年了,在我手上的发展史大概是这样的 第一个阶段 利用Mybatis-Generator自动生成实体类.DAO接口和Mapping映射文件.那时候觉得这个特别好用,大概的过程是这样的 在数据库中先建好表配置好几个xml文件(一般都是复制粘贴上一个项目的),然后根据数据库中的表,生成实体类.DAO接口和Mapping映射文件当需要添加数据操作的时候,先在xml中写好CRUD语句,然后在DAO接口层写接口,最后到映射文件渐渐地,我忽然发现,这种方式越来越烦.改一个字段,要修改很多

多级指标打分表单自动创建JavaScript代码解析

为了解释按多级指标自动创建打分表的设计,以及相关指标考核打分业务,写了Demo代码供开发人员参考,主要涉及到Table动态操作技术及算法实践. 1. HTML DOM Table 对象操作 1.1. 插入一行 使用HTML DOM insertRow() 方法,insertRow(index) 方法用于在表格中的指定位置插入一个新行. 若 index 等于表中的行数,则新行将被附加到表的末尾. 1.2. 插入单元格 使用HTML DOM insertCell() 方法,insertCell()

Delphi中主窗体的formshow事件在程序自动创建窗体对象前就调用的错误。

这个,实际我也不知道这个标题该怎么写.因为用一句话描述错误有点困难. 下面用代码来说明吧. 最近做了一个delphi的程序,按照我的习惯一般是先创建一个窗体作为主窗体,其他的窗体都在这个基础上显示.另外,由于使用了数据库,所以添加了一个TDataModule控件,便于一些不能防止控件的单元进行数据库操作.把其他所有的窗体都设置为非自动创建.然后通过application.createform方法进行动态创建和调用. 好了,问题出现了. 在工程文件中有如下代码: Application.Creat

thinkphp笔记-创建数据

这段代码看不懂.-<thinkphph3.2.3快速入门> <?phpnamespace Home\Controller;use Think\Controller;class FormController extends Controller{public function insert(){$Form = D('Form');if($Form->create()) {$result = $Form->add();if($result) {$this->success(

thinkphp自动验证

1.thinkphp的自动验证 自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 1.1应用范围: 进行数据类型.业务规则.安全判断等方面的验证. 1.2验证方式: 1.静态方式:在模型类里面通过$_validate属性定义验证规则. 2.动态方式:使用模型类的validate方法动态创建自动验证规则. 1.3验证规则: 例:一个简单的注册信息时的自动验证: <?php namespace Home\Model; use Thin

ThinkPHP 自动验证与自动填充无效可能的原因

原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关. create 方法语法如下: c

TP3.2关于创建数据create

create三种创建数据机制:1.直接是数组创建数据    $data['name'] = 'ThinkPHP';    $data['email'] = '[email protected]';    $User->create($data); 2.从对象创建数据    $User = stdClass();    $User->name = 'ThinkPHP';    $User->email = '[email protected]';    $Member = M("