关键词搜索

源码搜索 ×
×

TP6 模型操作数据(添加/插入/增加/更新/修改/查询)

发布2021-11-26浏览9793次

详情内容

TP6模型原理与基本操作教程_php菜鸟技术天地-CSDN博客

查询:

  1. $rsec = ChatCard::where('uid',$uid)->find();
  2. //查询表有后缀
  3. $rsec = ChatCard::suffix($setSuffix_7d)->where('uid',$uid)->find();
  4. //输出SQL
  5. $rsec = ChatCard::suffix($setSuffix_7d)->where('uid',$uid)->fetchSql(true)->find();

注意:save()方法添加与更新

  1. 更改保存默认数据库连接,把数据保存到其它库中
  2. $Guestbook->connect('ente_cold')->save($postdata);
  3. 保存到默念连接数据库中
  4. $Guestbook->save($postdata);

1.不用判断添加、更新是否成功,有错误会自动抛出

下面是错误写法:

  1. //错误写法
  2. $Guestbook->save($postdata);
  3. if($Guestbook->isEmpty()){
  4. throw new \Exception('保存失败!');
  5. }

2.添加数据:默认只会写入数据表已有的字段

默认只会写入数据表已有的字段,如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用:

  1. $user = new User;
  2. // post数组中只有name和email字段会写入
  3. $user->allowField(['name','email'])->save($_POST);

最佳的建议是模型数据赋值之前就进行数据过滤,例如:

  1. $user = new User;
  2. // 过滤post数组中的非数据表字段数据
  3. $data = Request::only(['name','email']);
  4. $user->save($data);

3.不要在同一个实例里面多次新增数据,如果确实需要多次新增,可以使用后面的静态方法处理。

静态方法

还可以直接静态调用create方法创建并写入:

  1. $user = User::create([
  2. 'name' => 'thinkphp',
  3. 'email' => 'thinkphp@qq.com'
  4. ]);
  5. echo $user->name;
  6. echo $user->email;
  7. echo $user->id; // 获取自增ID

save方法不同的是,create方法返回的是当前模型的对象实例。

create方法默认会过滤不是数据表的字段信息,可以在第二个参数可以传入允许写入的字段列表,例如:

  1. // 只允许写入name和email字段的数据
  2. $user = User::create([
  3. 'name' => 'thinkphp',
  4. 'email' => 'thinkphp@qq.com'
  5. ], ['name', 'email']);
  6. echo $user->name;
  7. echo $user->email;
  8. echo $user->id; // 获取自增ID

4.save方法更新数据,只会更新变化的数据,对于没有变化的数据是不会进行重新更新的。如果你需要强制更新数据,可以使用下面的方法

  1. $user = User::find(1);
  2. $user->name = 'thinkphp';
  3. $user->email = 'thinkphp@qq.com';
  4. $user->force()->save();

5.自动识别

我们已经看到,模型的新增和更新方法都是save方法,系统有一套默认的规则来识别当前的数据需要更新还是新增。

  • 实例化模型后调用save方法表示新增;
  • 查询数据后调用save方法表示更新;

不要在一个模型实例里面做多次更新,会导致部分重复数据不再更新,正确的方式应该是先查询后更新或者使用模型类的update方法更新

不要调用save方法进行多次数据写入。

实际例子:

1.分布式数据库插入多表数据,有事务需要回滚

调用:

  1. //引用
  2. use app\services\table\model\Guestbook;
  3. //静态调用
  4. $returnData = Guestbook::saveGuestbook($postdata);

表对应模型文件代码:

  1. <?php
  2. namespace app\services\table\model;
  3. use think\Model;
  4. use think\facade\Db;
  5. use app\services\table\validate\GuestbookValidate;
  6. class Guestbook extends Model
  7. {
  8. protected $name = 'guestbook'; //表名
  9. protected $connection = 'enterprise_cold';//数据库的连接
  10. protected $autoWriteTimestamp = 'int';
  11. protected $createTime = 'time';
  12. // protected $updateTime = 'utime';
  13. // 设置字段信息
  14. protected $schema = [
  15. 'id' => 'int',
  16. 'uid' => 'bigint',//(唯一:前端用户取得电脑MAC转为十制进数字)
  17. 'enterprise_id' => 'int',
  18. 'phone' => 'string',
  19. 'username' => 'string',
  20. 'content' => 'string',
  21. 'gid' => 'int',
  22. 'sid' => 'int',
  23. 'wx' => 'string',
  24. 'email' => 'string',
  25. 'qq' => 'int',
  26. 'url' => 'string',
  27. 'ip' => 'string',
  28. 'type' => 'int',
  29. 'hide' => 'int',
  30. 'deleted' => 'int',
  31. 'deleted_time' => 'int',
  32. 'deleted_userid' => 'int',
  33. 'time' => 'int',
  34. ];
  35. /**
  36. * @name 保存访客提交过来的留言
  37. * @method Model
  38. * @date 2021-11-19
  39. * @param 1 $postdata arr/必填 提交数组
  40. * @ruturn array
  41. */
  42. static public function saveGuestbook(array $postdata)
  43. {
  44. Db::connect('enterprise_cold')->startTrans();
  45. Db::connect('enterprise_heat')->startTrans();
  46. try {
  47. $postdata['enterprise_id'] = !empty($postdata['eid'])?$postdata['eid']:0;
  48. validate(GuestbookValidate::class)->scene('onlineserviceApi_tel')->check($postdata);
  49. // $eid = !empty($postdata['enterprise_id'])?$postdata['enterprise_id']:0;
  50. $enterpriseData = numberEncodeDecodeHashids('enterprise',$postdata['enterprise_id'],1);//解密
  51. if($enterpriseData['code']!=200){
  52. throw new \Exception("非法提交,互联网不是法外之地,请慎重!");
  53. }
  54. //客服分组ID
  55. if(!empty($postdata['gid'])){
  56. $enterpriseData = numberEncodeDecodeHashids('onlineservice_group',$postdata['gid'],1);//解密
  57. if($enterpriseData['code']!=200){
  58. throw new \Exception("非法提交,互联网不是法外之地,请慎重!");
  59. }
  60. }
  61. //客服ID
  62. if(!empty($postdata['sid'])){
  63. $enterpriseData = numberEncodeDecodeHashids('enterprise_userid',$postdata['sid'],1);//解密
  64. if($enterpriseData['code']!=200){
  65. throw new \Exception("非法提交,互联网不是法外之地,请慎重!");
  66. }
  67. }
  68. $postdata['enterprise_id'] = $enterpriseData['data'][0];
  69. //1.7天表、1个月表
  70. self::connect('enterprise_heat')->setSuffix('_7d')->save($postdata);//7天表
  71. self::connect('enterprise_heat')->setSuffix('_1m')->save($postdata);//1个月表
  72. //2.今年表 以前表
  73. (new static())->setSuffix('_1y')->save($postdata);//今年表
  74. (new static())->save($postdata);//以前表(所有数据表)
  75. $code=200;$msg="成功";
  76. Db::connect('enterprise_cold')->commit();
  77. Db::connect('enterprise_heat')->commit();
  78. } catch (\Exception $e) {
  79. Db::connect('enterprise_cold')->rollback();
  80. Db::connect('enterprise_heat')->rollback();
  81. $code=-200;$msg=$e->getMessage();
  82. }
  83. return ['code' => $code,'msg' =>$msg];
  84. }
  85. }

 取得自增ID

  1. $rs = self::connect('chat_heat')->setSuffix($setSuffix_7d);
  2. $rs->save($postdata);//7天表
  3. dump($rs->id);die;

2.单库单表插入数据(有事就启用)

调用:

  1. //引用
  2. use app\services\table\model\Guestbook;
  3. //动态调用 要实例化
  4. $TaskLog =new TaskLog();
  5. $returnData = $TaskLog ->saveGuestbook($postdata);

表对应模型文件代码:

  1. <?php
  2. namespace app\services\table\model;
  3. use think\Model;
  4. use think\facade\Db;
  5. use app\services\table\validate\TaskLogValidate;
  6. /**
  7. * @name 任务日志
  8. * @method Model/POST/GET/
  9. * @date 2021-12-01
  10. */
  11. class TaskLog extends Model
  12. {
  13. protected $name = 'task_log'; //表名
  14. protected $connection = 'log';//数据库的连接
  15. protected $autoWriteTimestamp = 'int';
  16. protected $createTime = 'time';
  17. // protected $updateTime = 'utime';
  18. // 设置字段信息
  19. protected $schema = [
  20. 'id' => 'int',
  21. 'user_id' => 'int',
  22. 'enterprise_id' => 'int',
  23. 'title' => 'string',
  24. 'data' => 'string',
  25. 'content' => 'string',
  26. 'starttime' => 'int',
  27. 'endtime' => 'int',
  28. 'url' => 'string',
  29. 'state' => 'int',
  30. 'url' => 'string',
  31. 'type' => 'int',
  32. 'mold' => 'int',
  33. 'delay' => 'int',
  34. 'time' => 'int',
  35. ];
  36. /**
  37. * @name 保存访客提交过来的留言
  38. * @method Model
  39. * @date 2021-11-19
  40. * @param 1 $postdata arr/必填 提交数组
  41. * @ruturn array
  42. */
  43. public function DataSave(array $postdata)
  44. {
  45. // Db::connect($this->connection)->startTrans();//有回滚就启用
  46. try {
  47. // if(empty($postdata)){
  48. // throw new \Exception("提交数据为空!");
  49. // }
  50. $postdata['enterprise_id'] = !empty($postdata['eid'])?$postdata['eid']:0;
  51. validate(TaskLogValidate::class)->check($postdata);
  52. if(!empty($postdata['enterprise_id'])){
  53. $enterpriseData = numberEncodeDecodeHashids('enterprise',$postdata['enterprise_id'],1);//解密
  54. if($enterpriseData['code']!=200){
  55. throw new \Exception("非法提交,互联网不是法外之地,请慎重!");
  56. }
  57. $postdata['enterprise_id'] = $enterpriseData['data'][0];
  58. }
  59. $this->save($postdata);//以前表(所有数据表)
  60. $code=200;$msg="成功";
  61. // Db::connect($this->connection)->commit();
  62. } catch (\Exception $e) {
  63. // Db::connect($this->connection)->rollback();
  64. $code=-200;$msg=$e->getMessage();
  65. }
  66. return ['code' => $code,'msg' =>$msg];
  67. }
  68. }

官网教程:

新增 · ThinkPHP6.0完全开发手册 · 看云

更新 · ThinkPHP6.0完全开发手册 · 看云

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载