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

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

静态方法 create 

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

$data = ['username' => 'a'];

$result = TestModel::create($data);

生成的 SQL 如下

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

返回值

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

重要提醒

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

$test = new TestModel();

$data = ['name' => 'a'];

$result = TestModel::create($data);

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

SHOW COLUMNS FROM `test`

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

object(app\index\model\Test)#43 (2) {
  ["data"]=>
  array(1) {
    ["name"]=>
    string(1) "a"
  }
  ["relation"]=>
  array(0) {
  }
}

动态方法 save

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

$obj = new TestModel();

$data = ['username' => 'a'];
    
$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 语句的,如下

$data = ['name' => 'a']; // name 字段在表结构中是不存在的

$obj = new TestModel();

$result = $obj->save($data);

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

SHOW COLUMNS FROM `test`

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

bool(true)

更重要提醒

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

$user = new TestModel();

echo ("<pre>");
var_dump($user);
echo ("</pre>");

//新增前的 Test 实例
object(app\index\model\Test)#43 (2) {
  ["data"]=>
  array(0) {
  }
  ["relation"]=>
  array(0) {
  }
}


//执行新增
$data = ['name' => 'a'];
$user->save($data);


echo ("<pre>");
var_dump($user);
echo ("</pre>");

//执行新增后的 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) ,否则会视为更新操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值