ThinkPHP3.2.3中CURD的数据创建时数据操作状态如何操作呢?
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错误的问题。