• thinkphp 数据创建


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

    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 HomeModel;
    2. use ThinkModel;
    3. class UserModel extends Model{
    4. protected $insertFields = 'name,email'; // 新增数据的时候允许写入name和email字段
    5. protected $updateFields = 'email'; // 编辑数据的时候只允许写入email字段
    6. }
  • 相关阅读:
    8.20 附加赛3
    8.22 附加赛4
    Codeforces Round #505 (Div 1 + Div 2) (A~D)
    8.9 附加赛2
    8.10 正睿暑期集训营 Day7
    8.9 正睿暑期集训营 Day6
    8.8 正睿暑期集训营 Day5
    8.7 正睿暑期集训营 Day4
    8.6 正睿暑期集训营 Day3
    8.5 正睿暑期集训营 Day2
  • 原文地址:https://www.cnblogs.com/furuihua/p/11805343.html
Copyright © 2020-2023  润新知