关键词搜索

源码搜索 ×
×

TP6模型原理与基本操作教程

发布2021-11-20浏览1582次

详情内容

模型简介

  1. /*
  2. Navicat MySQL Data Transfer
  3. Source Server : 127.0.0.1
  4. Source Server Version : 50726
  5. Source Host : localhost:3306
  6. Source Database : tp6
  7. Target Server Type : MYSQL
  8. Target Server Version : 50726
  9. File Encoding : 65001
  10. Date: 2020-05-28 11:45:22
  11. */
  12. SET FOREIGN_KEY_CHECKS=0;
  13. -- ----------------------------
  14. -- Table structure for user
  15. -- ----------------------------
  16. DROP TABLE IF EXISTS `user`;
  17. CREATE TABLE `user` (
  18. `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  19. `name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
  20. `age` tinyint(3) unsigned NOT NULL,
  21. `email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  22. `password` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  23. PRIMARY KEY (`user_id`)
  24. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  25. -- ----------------------------
  26. -- Records of user
  27. -- ----------------------------
  28. INSERT INTO `user` VALUES ('1', '韦小宝', '35', 'wexiaobao@php.cn', 'e10adc3949ba59abbe56e057f20f883e');
  29. INSERT INTO `user` VALUES ('2', '小龙女', '50', 'xln@php.cn', 'e10adc3949ba59abbe56e057f20f883e');
  30. INSERT INTO `user` VALUES ('3', '过儿', '25', 'ge@php.cn', 'e10adc3949ba59abbe56e057f20f883e');
  31. INSERT INTO `user` VALUES ('4', '郭大侠', '45', 'gj@php.cn', 'e10adc3949ba59abbe56e057f20f883e');

第1步:( app\index\model\User.php )新建model文件目录,并在其下方新建一个类文件User.php内容如下

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model{
  5. protected $table = 'user';
  6. protected $pk = 'user_id';
  7. }

第2步:( app\index\controller\ModelTest.php )在controller文件目录下,新建一个类文件 ModelTest .php内容如下

  1. <?php
  2. namespace app\index\controller;
  3. use app\index\model\User;
  4. class ModelTest{
  5. //模型对象
  6. public function demo1()
  7. {
  8. //创建模型对象
  9. $user = new User();
  10. //查询一条数据
  11. $res = $user->db()->find(1);
  12. dump($res);
  13. //查询所有数据
  14. //$res = $user->db()->select();
  15. //测试打印输出对象方式 dump()/var_dump()
  16. // var_dump 打印输出对象:var_dump($user);
  17. // dump($res);
  18. // dump(gettype($user));
  19. }
  20. //依赖注入
  21. public function demo2(User $user)
  22. {
  23. $res = $user->db()->find(3);
  24. //dump($res);
  25. var_dump($res);
  26. echo '<hr>';
  27. echo $res['name'];
  28. echo '<br/>';
  29. echo $res->name;
  30. }
  31. //1.新增操作:create():参数就是要新增的数据,返回当前模型对象
  32. public function insert()
  33. {
  34. $data = ['name'=> '乔峰','age'=>40,'email'=>'qiaofeng@php.cn','password'=>Md5('123')]; // 根据数据库字段设置,也可以用 sha1('123')
  35. $user = User::create($data);
  36. $insertId = $user['user_id'];
  37. return '新增成功,新增记录的主键ID是:'.$insertId;
  38. }
  39. //2.查询操作
  40. //在tp6中,删除了传统的get/all,直接用db()来调用Query类中的方法完成
  41. public function select(User $user)
  42. {
  43. //单条 查看对象:var_dump($user->db());
  44. echo '打印单条数据:';
  45. $res1 = $user->db()->find(3);
  46. dump($res1);
  47. echo '<hr>';
  48. echo '打印全部数据:';
  49. //all() 根据条件 where() 打印出年龄大于30的所有数据
  50. $res2 = $user->db()->where('age','>',30)->select();
  51. dump($res2);
  52. }
  53. //3.更新操作:update
  54. public function update()
  55. {
  56. $user = User::update(['age'=>50],['user_id'=>2]);
  57. return '年龄已经被更新成:'.$user['age'];
  58. }
  59. // 4.删除操作:destroy():返回布尔值
  60. public function delete()
  61. {
  62. //删除user_id 等于 5的数据记录
  63. //删除方式1:静态方法方式
  64. // $res = User::destroy(['user_id'=>5]);
  65. //删除方式2:闭包方式,根据条件,删除user_id 等于5的记录
  66. $res = User::destroy( function($query){
  67. $query->where('user_id',5); //凡是使用静态方法的,都可以用闭包方式传递参数,例如:User::destroy和User::update
  68. });
  69. return $res ? '删除成功':'删除失败';
  70. }
  71. }

运行结果截图

总结

模型基本操作一

创建模型类: 类名与数据库同名
实例化方式: 类方法中实例化,依赖注入(外部实例化)
常用操作: CURD(增删改查)
调用方式:
实例方法: 必须通过模型对象调用
静态方法: 直接用模型类调用(推荐)

模型基本操作二

查询:db()
新增:create()
更新: update()
删除: destory()

使用:

  1. //引用
  2. use app\services\table\model\Guestbook;
  3. //实例化
  4. $Guestbook = new GuestbookModel();
  5. //写入默认数据库(protected $connection = 'enterprise_cold')的表
  6. $rs=$Guestbook->save([
  7. 'username' => 'thinkphp',
  8. 'phone' => '1364002250'
  9. ]);
  10. //写入其它数据库(enterprise)中,不使用默认值
  11. $rs=$Guestbook->connect('enterprise')->save([
  12. 'username' => 'thinkphp',
  13. 'phone' => '1364002250'
  14. ]);

实际例子:

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. }

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. }

相关技术文章

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

提示信息

×

选择支付方式

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