thinkphp 数据创建
在进行数据操作之前,我们往往需要手动创建需要的数据,例如对于提交的表单数据:
// 获取表单的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 | 生成数据对象(保存在内存) |
因此,我们熟悉的令牌验证、自动验证和自动完成功能,其实都必须通过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字段}
thinkphp 数据创建的更多相关文章
- ThinkPHP 自动创建数据、自动验证、自动完成详细例子介绍(十九)
原文:ThinkPHP 自动创建数据.自动验证.自动完成详细例子介绍(十九) 1:自动创建数据 //$name=$_POST['name']; //$password=$_POST['password ...
- thinkphp 数据写入
直线电机优势 ThinkPHP的数据写入操作使用add方法,使用示例如下: $User = M("User"); // 实例化User对象 $data['name'] = 'Thi ...
- CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总
CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...
- spark1.4加载mysql数据 创建Dataframe及join操作连接方法问题
首先我们使用新的API方法连接mysql加载数据 创建DF import org.apache.spark.sql.DataFrame import org.apache.spark.{SparkCo ...
- 一种从JSON数据创建Java类的高效办法
<一种从JSON数据创建Java类的高效办法> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs JSON格式的数据经常会遇到,比如调用Web服 ...
- ArcGIS 网络分析[2] 利用自定义基础数据创建网络数据集
前言 似乎除了官方介绍的例子,我还没有在网上见过一篇介绍如何"使用自己的数据"创建"网络数据集"的文章. 有介绍几何网络的,有介绍如何用官方SanFrancis ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- MongoDB数据创建与使用
MongoDB数据创建与使用 创建数据库 代码功能:读取本地文本文件,并保存到数据库中 import pymongo #连接mongo数据库 client = pymongo.MongoClient( ...
- Java JSON数据创建和读取
Java json数据创建 package com.JavaTest; import com.google.gson.JsonArray; import com.google.gson.JsonOb ...
随机推荐
- 配置基于Devstack的嵌套KVM虚拟化
本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...
- hexo next主题深度优化(六),使用hexo-neat插件压缩页面,大幅度提升页面性能和响应速度。
文章目录 隆重感谢: 背景 开始 试水 成功的案例 安装插件,执行命令. hexo _config.yml文件添加 坑 跳过压缩文件的正确配置方式 压缩html时不要跳过.md文件 压缩html时不要 ...
- Linux下同一目录内文件和目录为什么不能同名?
问题描述: 如果事先有叫‘A’的文件夹存在,则不允许建立叫‘A’的文件: 同理若先有叫‘b’的文件存在,一样不允许建立叫‘b’的文件夹. 原因很简单,因为Linux下一切都是文件,一个目录归根到底还是 ...
- [CERC2017]Gambling Guide
题目 看起来非常随机游走,但是由于我们可以停在原地,所以变得不是非常一样 设\(f_x\)表示从\(x\)到\(n\)的期望距离 如果我们提前知道了\(f\),那么我们随机到了一张到\(y\)的车票, ...
- HTML_页面注册案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java中的栈Stack
Stack:栈是一种只能在一端进行插入或删除操作的线性表.(先进后出表) java中的Stack继承Vector 实例化 Stack stack=new Stack(); 基本使用 判断是否为空 st ...
- CSIC_716_20191106【列表、元组、字典、集合】
python的数据类型及其内置方法 一.列表(续) list.count( ).list.index( ) list = ['1', '2', '3', '2', 'a', 'b', 'c', 'a' ...
- 5.从物理层到MAC层
第一层(物理层) 如何用两台电脑构成最小的局域网(LAN)? 网线的水晶头1.2和3.6脚分别起着收.发信号的作用,随意只要将水晶头做交叉线1-3.2-6交叉法,然后连接两台电脑.除了 ...
- IPsec分析/测试/
一 局域网拓扑图 局域网环境搭建步骤: (升级最新版本 ,恢复出厂设置后) 1 两台网关wan口直连,分别接两台pc , 2 局域网网络测试,正常情况下PC1 和PC2 互通 ,测试通过在进行ip ...
- python相关软件安装流程图解——MySQL 8.0.13安装教程(windows 64位)——MYSQL依赖的软件——MYSQL必须的系统DLL插件——MYSQL真正的安装
https://www.mysql.com/https://www.mysql.com/downloads/https://dev.mysql.com/downloads/windows/https: ...