需求来源
用上tp6,项目开发的时候遇到了大问题……
我怎么知道:
有没有成功新增/修改数据呢?
修改了多少条呢?
如果主键是其他名字那又如何解决这些问题呢?
………………………………
最近终于搞懂了,一一解决了这些问题
借此机会记录一下,免得以后再走弯路emmm……
正文
▲ 插入(save / create)
情况①:new Model后用save(或加个allowField)
$query = new UserModel;
$query->allowField(['id', 'name','phone']) // 视情况而定
->save([
'id' => makeUUID(),
'name' => '小生蚝',
'phone' => '13300000000'
]);
在这种情况下
虽然官方说的是返回boolean值
但实际上却很奇怪地返回了以下这种东西:
★ 大前提:
①我的model里设置了pk为key_id:protected $pk = 'key_id';
②数据表中的key_id为自增主键,id为36位UUID
{
"id": "c22cb36e-63f6-166e-8c11-f9b4c292e2a6",
"name": "小生蚝",
"phone": "13300000000",
"key_id": "11"
}
由此我们可以推断出,我们其实是要根据key_id(即“自增主键”)来判断是否插入成功。
(而且这个自增主键居然还是string😒)
情况②:直接 Model::create()
$query = UserModel::create([
'id' => makeUUID(),
'name' => '小生蚝',
'phone' => '13300000000'
]);
因为create是静态方法,返回的是模型的对象实例
所以可以直接 判断自增主键 以确认是否插入成功(但记得要在model里设置主键)
★ 小小建议
其实如果不需要用到模型方法的话,建议还是使用情况②吧
因为save的未知数太多……
光是文档里就写到说返回true,下面又说返回写入的记录数而不是自增值
(具体可点击查看 官方文档)
还不如直接create,反正也能实现字段过滤功能,返回的东西也是和官方一样的
▲ 更新数据(where->save / where->find->save / update)
情况①:Model->where->save
这个方法是最好的了,直接返回有修改的条数,判断是否大于0就行 √
$query = UserModel::where('id', $id)->save(['status' => 0]);
情况②:Model->where->find->save
这个方法有个好处就是可以使用allowField来限制修改列,而情况①则不能
此处返回的是boolean值
但有个弊端❗❗ 此处无论记录是否有修改,只要无error都会返回true
所以还是没办法真正验证是否已修改数据唉……
$query = UserModel::where('id', $_POST['id'])
->find()
->allowField(['name', 'sex', 'phone', 'email'])
->save($_POST);
情况③:update
因为这个是静态方法,也返回的是模型的对象实例
所以没找到什么好的办法判断是否修改成功………………
无解,还是用情况①吧……
后记
请原谅一下一位由初二开始自学php的渣渣高中毕业生的能力……
这篇文章 是我在开发过程中 遇到问题后,解决并测试成功的情况
只不过因高中生的能力有待提高,文中可能有大量bug,请您直接指出或批评亦可
在此也非常感谢各位读者的支持~
祝各位程序猿遇到bug也能顺利解决!