php tp3.2 添加表内容,数据创建 · ThinkPHP3.2.3完全开发手册 · 看云
在进行数据操作之前,我们往往需要手动创建需要的数据,例如对于提交的表单数据:
~~~
// 获取表单的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完全开发手册 · 看云相关推荐
- 数据缓存 php,数据缓存 · ThinkPHP3.2.3完全开发手册 · 看云
在ThinkPHP中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,直接采用S方法即可,例如: ## 缓存初始化 ~~~ // 缓存初始化 S(array('type ...
- php记录读取数据类型,数据读取 · ThinkPHP 3.2.3开发手册 · 看云
# 数据读取 在ThinkPHP中读取数据的方式很多,通常分为读取数据.读取数据集和读取字段值. 数据查询方法支持的连贯操作方法有: 连贯操作 作用 支持的参数类型where 用于查询或者更新条件的定 ...
- php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云
## 定义 ThinkPHP3.2版本提供了把每个操作方法定位到一个类的功能,可以让你的开发工作更细化,可以设置参数**ACTION_BIND_CLASS**,例如: ~~~ 'ACTION_BIND ...
- ccflow表结构与运行机制(二次开发必看)
驰骋工作流引擎,工作流程管理系统,表结构与运行机制. 前言: 1, ccflow 有自动修复数据表功能, 所以表的字段的变化不需要用户干预由ccflow自动完成. 所以如果你看到sql的错误,在执行一 ...
- php 数据中心,数据层 · Thinkphp 独立数据中心使用手册 · 看云
[TOC] ## 概述 数据层是用来直接操作数据表的,数据层的方法都是原子的操作,应避免在数据层中处理具体业务流程,具体业务流程应在逻辑层进行处理. ## 数据层类定义 数据层类通常需要继承核心的\t ...
- php心跳检测实时数据,心跳检测 · swoole手册 · 看云
# 心跳 注意:长链接应用必须加心跳,否则链接可能由于长时间未通讯被路由节点强行断开. 心跳作用主要有两个: 1.客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连 ...
- Mysql: 表中数据的增删改
Mysql: 表中数据的增删改 每博一文案 林清玄曾说,我要开花,是为了完成,我作为一株花的庄严生命,不管你们 怎么看我,我都要开花.人生在世,无论我们怎么迎合别人,都不可能让所有 人都满意,得到每个 ...
- mysql添加表或字段注释
添加表注释 1.创建表的时候写注释 create table test1 ( field_name int comment '字段的注释' )comment='表的注释'; 2.修改表的注释 alte ...
- wordpress添加媒体_如何在WordPress中添加精选内容滑块
wordpress添加媒体 Do you want to add a featured content slider like Yahoo or ESPN? Many popular sites us ...
最新文章
- FZU 2082 过路费
- oop 类和对象的_实用程序类的OOP替代
- 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...
- HTTP Status 500 - An exception occurred processing JSP page /common/../left.jsp at line 20
- 应用系统运行监控界面_重庆悦来会展二期电力监控系统的设计与应用
- 【Python实例第21讲】确定类个数的silhouette分析法
- Zipf齐夫分布及Java实现
- 基于min-max搜索和alpha-beta(α-β)剪枝的五子棋的c语言实现(带简单禁手)
- Koo叔说Shader—开篇
- 时间序列预测--基于CNN的股价预测
- 逻辑思维训练——假设法
- VB6.0 读取Excel2010简单方法(附源码和注释,可伸手)
- [NOIP2003] 提高组 洛谷P1039 侦探推理
- 极验验证码逆向(二)
- python指定依赖库路径
- 第六周(作业1,Mysql下载安装配置)
- iOS蓝牙开发连接系统或其他APP已经连接、配对成功的蓝牙设备
- 最实用,无后顾之忧----vue移动端或web端手写签批橡皮擦功能,基于vue-drawing-canvas组件
- OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
- three.js—纹理贴图texture的使用