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

  1. // 获取表单的POST数据
  2. $data['name'] = $_POST['name'];
  3. $data['email'] = $_POST['email'];
  4. // 更多的表单数据值获取
  5. //……

创建数据对象

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

很简单的例子:

  1. // 实例化User模型
  2. $User = M('User');
  3. // 根据表单提交的POST数据创建数据对象
  4. $User->create();

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

  1. $data['name'] = 'ThinkPHP';
  2. $data['email'] = 'ThinkPHP@gmail.com';
  3. $User->create($data);

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

  1. // 从User数据对象创建新的Member数据对象
  2. $User = stdClass();
  3. $User->name = 'ThinkPHP';
  4. $User->email = 'ThinkPHP@gmail.com';
  5. $Member = M("Member");
  6. $Member->create($User);

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

  1. $data['name'] = 'ThinkPHP';
  2. $data['email'] = 'ThinkPHP@gmail.com';
  3. $User->create($data);
  4. // 创建完成数据对象后可以直接读取数据
  5. echo $User->name;
  6. echo $User->email;
  7. // 也可以直接修改创建完成的数据
  8. $User->name = 'onethink'; // 修改name字段数据
  9. $User->status = 1; // 增加新的字段数据

数据操作状态

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

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

  1. $Member = M("User");
  2. // 指定更新数据操作状态
  3. $Member->create($_POST,Model::MODEL_UPDATE);

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

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

  1. $Member = M("User");
  2. // 指定更新数据操作状态
  3. $Member->create($_POST,3);

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

步骤 说明 返回
1 获取数据源(默认是POST数组)  
2 验证数据源合法性(非数组或者对象会过滤) 失败则返回false
3 检查字段映射  
4 判断数据状态(新增或者编辑,指定或者自动判断)  
5 数据自动验证 失败则返回false
6 表单令牌验证 失败则返回false
7 表单数据赋值(过滤非法字段和字符串处理)  
8 数据自动完成  
9 生成数据对象(保存在内存)  

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

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

  1. $data['name'] = 'thinkphp';
  2. $data['email'] = 'thinkphp@gmail.com';
  3. $data['status'] = 1;
  4. $User = M('User');
  5. $data = $User->create($data);
  6. dump($data);

输出结果为:

  1. array (size=3)
  2. 'name' => string 'thinkphp' (length=8)
  3. 'email' => string 'thinkphp@gmail.com' (length=18)
  4. 'status'=> int 1

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

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

  1. $User = M('User');
  2. $User->create(); //创建User数据对象
  3. $User->status = 1; // 设置默认的用户状态
  4. $User->create_time = time(); // 设置用户的创建时间
  5. $User->add(); // 把用户对象写入数据库

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

  1. // 实例化User模型
  2. $User = M('User');
  3. // 创建数据后写入到数据库
  4. $data['name'] = 'ThinkPHP';
  5. $data['email'] = 'ThinkPHP@gmail.com';
  6. $User->data($data)->add();

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

支持的连贯操作

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

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

连贯操作 作用 支持的参数类型
field 用于定义合法的字段 字符串和数组
validate 用于数据自动验证 数组
auto 用于数据自动完成 数组
token 用于令牌验证 布尔值

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

字段合法性过滤

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

  1. $data['name'] = 'thinkphp';
  2. $data['email'] = 'thinkphp@gmail.com';
  3. $data['status'] = 1;
  4. $data['test'] = 'test';
  5. $User = M('User');
  6. $data = $User->field('name,email')->create($data);
  7. dump($data);

输出结果为:

  1. array (size=2)
  2. 'name' => string 'thinkphp' (length=8)
  3. 'email' => string 'thinkphp@gmail.com' (length=18)
复制代码
 

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

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

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

thinkphp 数据创建的更多相关文章

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

    原文:ThinkPHP 自动创建数据.自动验证.自动完成详细例子介绍(十九) 1:自动创建数据 //$name=$_POST['name']; //$password=$_POST['password ...

  2. thinkphp 数据写入

    直线电机优势 ThinkPHP的数据写入操作使用add方法,使用示例如下: $User = M("User"); // 实例化User对象 $data['name'] = 'Thi ...

  3. CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总

    CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...

  4. spark1.4加载mysql数据 创建Dataframe及join操作连接方法问题

    首先我们使用新的API方法连接mysql加载数据 创建DF import org.apache.spark.sql.DataFrame import org.apache.spark.{SparkCo ...

  5. 一种从JSON数据创建Java类的高效办法

    <一种从JSON数据创建Java类的高效办法> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs JSON格式的数据经常会遇到,比如调用Web服 ...

  6. ArcGIS 网络分析[2] 利用自定义基础数据创建网络数据集

    前言 似乎除了官方介绍的例子,我还没有在网上见过一篇介绍如何"使用自己的数据"创建"网络数据集"的文章. 有介绍几何网络的,有介绍如何用官方SanFrancis ...

  7. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  8. MongoDB数据创建与使用

    MongoDB数据创建与使用 创建数据库 代码功能:读取本地文本文件,并保存到数据库中 import pymongo #连接mongo数据库 client = pymongo.MongoClient( ...

  9. Java JSON数据创建和读取

    Java  json数据创建 package com.JavaTest; import com.google.gson.JsonArray; import com.google.gson.JsonOb ...

随机推荐

  1. 《DSP using MATLAB》Problem 9.4

    只放第1小题. 代码: %% ------------------------------------------------------------------------ %% Output In ...

  2. Solrj API读取core 索引库数据

    private static String zkHost = "ip:2181,ip:2181,ip:2181"; private static CloudSolrServer s ...

  3. C盘清理垃圾

    经常清理C盘垃圾,会让系统运行更快,避免死机,今天教大家一种简单实用的方法,用文本文档清理垃圾: 1:在电脑桌面空白处右键-建立文本文档: 2:把以下代码复制到文本里 @echo offecho 正在 ...

  4. Django开发学习BUG记录--RemovedInDjango19Warning:Model class apps.user.models.User doesn't declare an explicit app_label

    报错信息: /home/python/PycharmProjects/dailyfresh/apps/user/models.py:8: RemovedInDjango19Warning: Model ...

  5. Jupyter的使用复习

    Jupyter的使用 esc+m 切换到markdown模式 shift+enter 运行 a 向上新增代码块 b 向下新增代码块 y python代码模式 file-->download as ...

  6. HTML_案例(注册案例CSS版)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 神经网络 (1)- Alexnet

    文章目录 模型结构 conv1层 conv2层 conv3层 conv4层 conv5层 FC6全链接图: fc7全连接层:和fc6类似. fc8链接层: 模型优化 选择ReLU作为激活函数 多GPU ...

  8. 重装系统后配置原有的mysql

    1.重装系统后配置原有的mysql 2.修改 my.ini [修改 basedir:MySQL当前所在路径 datadir  数据存放路径] [mysqld] # 设置3306端口 port= # 设 ...

  9. MySql学习笔记(一)之DQL常用查询

    MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...

  10. C++调用JS,JS调用C++

    JS调用C++,通过设置DIID_HTMLDocumentEvents事件,来捕获HTMLWINDOW上的事件,再通过事件对象的get_srcElement得到事件源,从而得到指定元素对象,从而获取元 ...