在进行数据操作之前,我们往往需要手动创建需要的数据,例如对于提交的表单数据:

~~~

// 获取表单的POST数据

$data['name'] = $_POST['name'];

$data['email'] = $_POST['email'];

// 更多的表单数据值获取

//……

~~~

## 创建数据对象

ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显。

很简单的例子:

~~~

// 实例化User模型

$User = M('User');

// 根据表单提交的POST数据创建数据对象

$User->create();

~~~

Create方法支持从其它方式创建数据对象,例如,从其它的数据对象,或者数组等

~~~

$data['name'] = 'ThinkPHP';

$data['email'] = 'ThinkPHP@gmail.com';

$User->create($data);

~~~

甚至还可以支持从对象创建新的数据对象

~~~

// 从User数据对象创建新的Member数据对象

$User = stdClass();

$User->name = 'ThinkPHP';

$User->email = 'ThinkPHP@gmail.com';

$Member = M("Member");

$Member->create($User);

~~~

创建完成的数据可以直接读取和修改,例如:

~~~

$data['name'] = 'ThinkPHP';

$data['email'] = 'ThinkPHP@gmail.com';

$User->create($data);

// 创建完成数据对象后可以直接读取数据

echo $User->name;

echo $User->email;

// 也可以直接修改创建完成的数据

$User->name = 'onethink'; // 修改name字段数据

$User->status = 1; // 增加新的字段数据

~~~

## 数据操作状态

create方法的第二个参数可以指定创建数据的操作状态,默认情况下是自动判断是写入还是更新操作。

也可以显式指定操作状态,例如:

~~~

$Member = M("User");

// 指定更新数据操作状态

$Member->create($_POST,Model::MODEL_UPDATE);

~~~

系统内置的数据操作包括`Model::MODEL_INSERT`(或者1)和`Model::MODEL_UPDATE`(或者2),当没有指定的时候,系统根据数据源是否包含主键数据来自动判断,如果存在主键数据,就当成`Model::MODEL_UPDATE`操作。

不同的数据操作状态可以定义不同的数据验证和自动完成机制,所以,你可以自定义自己需要的数据操作状态,例如,可以设置登录操作的数据状态(假设为3):

~~~

$Member = M("User");

// 指定更新数据操作状态

$Member->create($_POST,3);

~~~

事实上,create方法所做的工作远非这么简单,在创建数据对象的同时,完成了一系列的工作,我们来看下create方法的工作流程就能明白:

| 步骤 | 说明 | 返回 |

|-----|-----|-----|

| 1 | 获取数据源(默认是POST数组) | |

| 2 | 验证数据源合法性(非数组或者对象会过滤) | 失败则返回false |

| 3 | 检查字段映射 | |

| 4 | 判断数据状态(新增或者编辑,指定或者自动判断) | |

| 5 | 数据自动验证 | 失败则返回false |

| 6 | 表单令牌验证 | 失败则返回false |

| 7 | 表单数据赋值(过滤非法字段和字符串处理) | |

| 8 | 数据自动完成 | |

| 9 | 生成数据对象(保存在内存) | |

因此,我们熟悉的令牌验证、[自动验证](/thinkphp/thinkphp/1776)和[自动完成](/thinkphp/thinkphp/1777)功能,其实都必须通过create方法才能生效。

如果没有定义自动验证的话,create方法的返回值是创建完成的数据对象数组,例如:

~~~

$data['name'] = 'thinkphp';

$data['email'] = 'thinkphp@gmail.com';

$data['status'] = 1;

$User = M('User');

$data = $User->create($data);

dump($data);

~~~

输出结果为:

~~~

array (size=3)

'name' => string 'thinkphp' (length=8)

'email' => string 'thinkphp@gmail.com' (length=18)

'status'=> int 1

~~~

Create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用`add`或者`save`方法才会真正写入数据库。

因此在没有调用add或者save方法之前,我们都可以改变create方法创建的数据对象,例如:

~~~

$User = M('User');

$User->create(); //创建User数据对象

$User->status = 1; // 设置默认的用户状态

$User->create_time = time(); // 设置用户的创建时间

$User->add(); // 把用户对象写入数据库

~~~

如果只是想简单创建一个数据对象,并不需要完成一些额外的功能的话,可以使用data方法简单的创建数据对象。 使用如下:

~~~

// 实例化User模型

$User = M('User');

// 创建数据后写入到数据库

$data['name'] = 'ThinkPHP';

$data['email'] = 'ThinkPHP@gmail.com';

$User->data($data)->add();

~~~

Data方法也支持传入数组和对象,使用data方法创建的数据对象不会进行自动验证和过滤操作,请自行处理。但在进行add或者save操作的时候,数据表中不存在的字段以及非法的数据类型(例如对象、数组等非标量数据)是会自动过滤的,不用担心非数据表字段的写入导致SQL错误的问题。

## 支持的连贯操作

在执行create方法之前,我们可以调用相关的连贯操作方法,配合完成数据创建操作。

create方法支持的连贯操作方法包括:

| 连贯操作 | 作用 | 支持的参数类型 |

|-----|-----|-----|

| field | 用于定义合法的字段 | 字符串和数组 |

| validate | 用于数据自动验证 | 数组 |

| auto | 用于数据自动完成 | 数组 |

| token | 用于令牌验证 | 布尔值 |

更多的用法参考后续的内容。

## 字段合法性过滤

如果在create方法之前调用field方法,则表示只允许创建指定的字段数据,其他非法字段将会被过滤,例如:

~~~

$data['name'] = 'thinkphp';

$data['email'] = 'thinkphp@gmail.com';

$data['status'] = 1;

$data['test'] = 'test';

$User = M('User');

$data = $User->field('name,email')->create($data);

dump($data);

~~~

输出结果为:

~~~

array (size=2)

'name' => string 'thinkphp' (length=8)

'email' => string 'thinkphp@gmail.com' (length=18)

~~~

最终只有`name`和`email`字段的数据被允许写入,`status`和`test`字段直接被过滤了,哪怕status也是数据表中的合法字段。

如果我们有自定义模型类,对于数据新增和编辑操作的话,我们还可以直接在模型类里面通过设置`insertFields`和`updateFields`属性来定义允许的字段,例如:

~~~

namespace Home\Model;

use Think\Model;

class UserModel extends Model{

protected $insertFields = 'name,email'; // 新增数据的时候允许写入name和email字段

protected $updateFields = 'email'; // 编辑数据的时候只允许写入email字段

}

~~~

php tp3.2 添加表内容,数据创建 · ThinkPHP3.2.3完全开发手册 · 看云相关推荐

  1. 数据缓存 php,数据缓存 · ThinkPHP3.2.3完全开发手册 · 看云

    在ThinkPHP中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,直接采用S方法即可,例如: ## 缓存初始化 ~~~ // 缓存初始化 S(array('type ...

  2. php记录读取数据类型,数据读取 · ThinkPHP 3.2.3开发手册 · 看云

    # 数据读取 在ThinkPHP中读取数据的方式很多,通常分为读取数据.读取数据集和读取字段值. 数据查询方法支持的连贯操作方法有: 连贯操作 作用 支持的参数类型where 用于查询或者更新条件的定 ...

  3. php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云

    ## 定义 ThinkPHP3.2版本提供了把每个操作方法定位到一个类的功能,可以让你的开发工作更细化,可以设置参数**ACTION_BIND_CLASS**,例如: ~~~ 'ACTION_BIND ...

  4. ccflow表结构与运行机制(二次开发必看)

    驰骋工作流引擎,工作流程管理系统,表结构与运行机制. 前言: 1, ccflow 有自动修复数据表功能, 所以表的字段的变化不需要用户干预由ccflow自动完成. 所以如果你看到sql的错误,在执行一 ...

  5. php 数据中心,数据层 · Thinkphp 独立数据中心使用手册 · 看云

    [TOC] ## 概述 数据层是用来直接操作数据表的,数据层的方法都是原子的操作,应避免在数据层中处理具体业务流程,具体业务流程应在逻辑层进行处理. ## 数据层类定义 数据层类通常需要继承核心的\t ...

  6. php心跳检测实时数据,心跳检测 · swoole手册 · 看云

    # 心跳 注意:长链接应用必须加心跳,否则链接可能由于长时间未通讯被路由节点强行断开. 心跳作用主要有两个: 1.客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连 ...

  7. Mysql: 表中数据的增删改

    Mysql: 表中数据的增删改 每博一文案 林清玄曾说,我要开花,是为了完成,我作为一株花的庄严生命,不管你们 怎么看我,我都要开花.人生在世,无论我们怎么迎合别人,都不可能让所有 人都满意,得到每个 ...

  8. mysql添加表或字段注释

    添加表注释 1.创建表的时候写注释 create table test1 ( field_name int comment '字段的注释' )comment='表的注释'; 2.修改表的注释 alte ...

  9. wordpress添加媒体_如何在WordPress中添加精选内容滑块

    wordpress添加媒体 Do you want to add a featured content slider like Yahoo or ESPN? Many popular sites us ...

最新文章

  1. FZU 2082 过路费
  2. oop 类和对象的_实用程序类的OOP替代
  3. 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...
  4. HTTP Status 500 - An exception occurred processing JSP page /common/../left.jsp at line 20
  5. 应用系统运行监控界面_重庆悦来会展二期电力监控系统的设计与应用
  6. 【Python实例第21讲】确定类个数的silhouette分析法
  7. Zipf齐夫分布及Java实现
  8. 基于min-max搜索和alpha-beta(α-β)剪枝的五子棋的c语言实现(带简单禁手)
  9. Koo叔说Shader—开篇
  10. 时间序列预测--基于CNN的股价预测
  11. 逻辑思维训练——假设法
  12. VB6.0 读取Excel2010简单方法(附源码和注释,可伸手)
  13. [NOIP2003] 提高组 洛谷P1039 侦探推理
  14. 极验验证码逆向(二)
  15. python指定依赖库路径
  16. 第六周(作业1,Mysql下载安装配置)
  17. iOS蓝牙开发连接系统或其他APP已经连接、配对成功的蓝牙设备
  18. 最实用,无后顾之忧----vue移动端或web端手写签批橡皮擦功能,基于vue-drawing-canvas组件
  19. OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
  20. three.js—纹理贴图texture的使用

热门文章

  1. bash和vim的使用-1
  2. 【C语言】实现字符串逆序输出(包含空格的字符串)
  3. 求一个区间内所有的质数(C++实现)
  4. Apple开发者账号介绍
  5. java奥运2008_用java实现2008北京奥运会倒计时
  6. android 进度条图标方形_android 进度条的样式
  7. 尚硅谷李立超老师讲解web前端网课笔记
  8. Vue组件生命周期钩子和Vue-Router路由钩子的执行顺序
  9. 怎样学好机器视觉,又能省钱?
  10. m4s格式转换mp3_怎么把ogg音乐格式转换成mp3