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

// 获取表单的POST数据

$data['name'] = $_POST['name'];
$data['email'] = $_POST['email'];
// 更多的表单数据值获取//……

也可以用thinkPHP中自带I函数进行操作:

$data['name'] = I('name');
$data['email'] = I('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 生成数据对象(保存在内存)  

因此,我们熟悉的令牌验证、自动验证和自动完成功能,其实都必须通过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)

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

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

namespace Home\Model;
use Think\Model;
class UserModel extends Model{protected $insertFields = 'name,email'; // 新增数据的时候允许写入name和email字段protected $updateFields = 'email'; // 编辑数据的时候只允许写入email字段
}

ThinkPHP实现数据的创建相关推荐

  1. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格

    jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮,可以简单地为行分组.您可以简单地创建 ...

  2. python中使用zip函数基于两个列表数据list创建字典dict数据(Create a dictionary by passing the output of zip to dict)

    python中使用zip函数基于两个列表数据list创建字典dict数据(Create a dictionary by passing the output of zip to dict) 目录

  3. R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)

    R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录

  4. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建页脚摘要

    jQuery EasyUI 数据网格 - 创建页脚摘要 在本教程中,我们将向您展示如何在数据网格(datagrid)页脚显示摘要信息行. 为了显示页脚行,您应该设置 showFooter 属性为 tr ...

  5. 数据库建立索引、数据表创建规则、备用字段 / 保留字段 / 预留字段

    数据库建立索引 数据库.数据表建立索引的原则 数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作. 2,尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在w ...

  6. 03.三月风雨愁断肠,学习大数据特别忧伤——谈谈AKS创建SQL Server大数据群集创建愁断肠

    03.三月风雨愁断肠,学习大数据特别忧伤--谈谈AKS创建SQL Server大数据群集创建愁断肠 [TOC] 前言 使用AKS创建SQL Server大数据群集有几种方法,由于产品不断的更新,SQL ...

  7. 【MySQL】启动、数据库/数据表 创建/查看/删除

    文章目录 1. 启动数据库 mysql -u root -p 2. 数据库创建.查看.删除 2.1 数据库查看 show databases 2.2 选择数据库 select database() m ...

  8. ThinkPHP(1)——创建ThinkPHP项目

    创建php项目test 导入ThinkPHP 配置单入口文件 测试 thinkphp是单一入口的php框架,现在我们来创建一个thinkphp项目. 1.创建php项目test 我使用zend stu ...

  9. 关于DM达梦数据库,获取用户表信息、数据表结构、数据表创建语句、主键等信息的sql

    1.获取数据表中的字段名.类型.长度.描述 select name,reftype,length,descrip from ( select distinct A.COLUMN_ID as id, A ...

最新文章

  1. android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...
  2. node执行cmd命令方法
  3. 杨辉三角(下三角或者等腰三角)
  4. Apache服务器部署ASP.NET网站
  5. Python中令人头疼的变量作用域问题,终于弄清楚了
  6. Nginx深入详解之模块化体系结构
  7. 用JavaScript实现2+2=5的奥秘
  8. jquery-动效方法-animate
  9. 2018杭州电子科技大学计算机研究生复试笔试编程题第三题
  10. SharePoint Windows Workflow Foundation
  11. js对象深拷贝与浅拷贝
  12. 《现代操作系统》读书笔记
  13. vs2015安装vs assist 教程
  14. vscode python第三方库自动补全_vscode python 第三方库的智能提示
  15. postman虚拟服务器教程,postman安装与使用教程
  16. 如何禁用计算机内网,局域网计算机怎么禁用U盘
  17. 《犹太人想的和你不一样》
  18. 搞事课堂 C++格式化硬盘
  19. 微信报错errcode大全
  20. 美国大学计算机专业排名2014,2014年USNews美国大学计算机专业研究生排名

热门文章

  1. 港科夜闻|香港科大本科生科研计划奖(UROP)颁奖典礼于线上成功举办
  2. 微信小程序编程(1)——使用百度API编写文字识别小程序
  3. SVN搭建文件服务器
  4. 【JY】结构工程师:请避开有限元分析中6个常见的“坑”
  5. 计算机地图制图的过程,第四章计算机地图制图过程.ppt
  6. 重庆高考计算机分数线,2017年重庆高考录取分数线
  7. Error Message:网络连接错误,详细信息:Connection pool shut down
  8. 快手腾讯校招笔试题最长回文子序
  9. antd Form.Item的name是数组时如何取值
  10. 功能测试进阶自动化测试,你不试一下永远不知道自己的潜能