• TP5 模型新增的返回值、返回值的判断以及所使用的SQL


    TP5 模型新增主要使用静态方法 create 和动态方法 save 

    静态方法 create 

    直接使用模型类静态调用,例如 Test 模型类新增 username 为 a 的用户,如下

    1. $data = ['username' => 'a'];
    2. $result = TestModel::create($data);

    生成的 SQL 如下

     INSERT INTO `test` (`username`) VALUES ('a') 

    返回值

    执行 create 方法成功则返回当前新增数据的模型类实例,失败则报错

    重要提醒

    执行 create 方法成功不代表新增数据成功,如果当前新增数据的字段名在数据库内是不存在的, create 方法是不会向数据库发送 SQL 语句的,如下

    1. $test = new TestModel();
    2. $data = ['name' => 'a'];
    3. $result = TestModel::create($data);

    因为模型在执行新增操作前,会发送一条 SQL 语句获得表结构,如下

    SHOW COLUMNS FROM `test`

    因为 name 字段在表结构中是不存在的,所以 create 方法是不会向数据库发送 SQL 语句的,而且 create 方法不会有任何错误提示,依然能返回新增数据的模型类实例,如下

    1. object(app\index\model\Test)#43 (2) {
    2. ["data"]=>
    3. array(1) {
    4. ["name"]=>
    5. string(1) "a"
    6. }
    7. ["relation"]=>
    8. array(0) {
    9. }
    10. }

    动态方法 save

    使用模型类实例动态调用,例如 Test 模型类实例新增 username 为 a 的用户,如下

    1. $obj = new TestModel();
    2. $data = ['username' => 'a'];
    3. $result = $obj->save($data);

    生成的 SQL 如下

    INSERT INTO `test` (`username`) VALUES ('a') 

    返回值

    V5.1.6+版本以前

    save 方法返回新增的记录数

    V5.1.6+版本以后

    统一返回布尔值,如果执行 save 方法成功则返回 true(哪怕新增的行数是 0 也是返回 true ),并只有当 before_update 事件返回 false 的时候返回 false

    重要提醒

    1、从 V5.1.6+版本开始,save 方法只管执行 SQL 不管 SQL 执行后的结果,执行 SQL 成功则返回 true(哪怕新增的行数是 0 也是返回 true )

    2、和静态方法 create 一样,执行 save 方法成功不代表新增数据成功,如果当前新增数据的字段名在数据库内是不存在的, save 方法是不会向数据库发送 SQL 语句的,如下

    1. $data = ['name' => 'a']; // name 字段在表结构中是不存在的
    2. $obj = new TestModel();
    3. $result = $obj->save($data);

    因为模型在执行新增操作前,会发送一条 SQL 语句获得表结构,如下

    SHOW COLUMNS FROM `test`

    因为 name 字段在表结构中是不存在的,所以 save 方法是不会向数据库发送 SQL 语句的,而且 save 方法不会有任何错误提示,依然能返回 true,如下

    bool(true)

    更重要提醒

    save 方法会修改调用它的对象的数据

    1. $user = new TestModel();
    2. echo ("
      ");
    3. var_dump($user);
    4. echo ("
    ");
  • //新增前的 Test 实例
  • object(app\index\model\Test)#43 (2) {
  • ["data"]=>
  • array(0) {
  • }
  • ["relation"]=>
  • array(0) {
  • }
  • }
  • //执行新增
  • $data = ['name' => 'a'];
  • $user->save($data);
  • echo ("
    ");
  • var_dump($user);
  • echo ("");
  • //执行新增后的 Test 实例
  • object(app\index\model\Test)#43 (2) {
  • ["data"]=>
  • array(1) {
  • ["name"]=>
  • string(1) "a"
  • }
  • ["relation"]=>
  • array(0) {
  • }
  • }
  • 如上,Test 类实例的 data 属性(数组)里多了一个 name ,和 save 方法新增数据库里的数据是保持一致的。

    更更重要提醒

    因为模型的新增方法和更新方法都是 save 方法,所以 tp5 框架有一套默认的规则来识别当前 save 方法要执行新增操作还是更新操作

    1、不查询数据,直接模型对象调用 save 方法,表示新增

    2、查询数据后调用 save 方法表示更新

    3、save 方法传入更新条件表示更新

    4、可以在执行 save 方法前执行 isUpdate ( false) 方法指定当前 save 方法执行新增操作

    5、不要用同一个模型类实例执行多次 save 方法,如果确实需要多次新增,可以使用静态方法 create 

    6、如果你调用 save 方法进行多次数据新增,需要注意,第二次 save 方法的时候必须使用 isUpdate ( false) ,否则会视为更新操作。

  • 相关阅读:
    【退役之重学Java】关于Spring Cloud 微服务和分布式
    【无标题】
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园服装租赁系统864e2
    day02小程序快速入门
    前后端分离模式下,SpringBoot + CAS 单点登录实现方案
    SpringMVC处理请求核心流程
    动静态库详解
    Redis-cluster集群详细部署配置--有手就行
    【Proteus仿真】【Arduino单片机】蜂鸣器
    「教师资格证定期注册」相关答疑
  • 原文地址:https://blog.csdn.net/weixin_44161401/article/details/127671784