前言:

先交代下背景,在一个项目中,有一个数据表有水平分表的需求。当时想找到一种方法,把对数据库的操作,写到一个模型里,通过去换模型属性中的table来达到代码不变操作的数据表变化的效果。
我们都知道,模型要想关联数据表的话,有两中方式,第一种就是将模型名和数据表一致。这样模型就会默认关联到名字对应的数据表。第二种就是定义模型的 protected $table 来指定表明。我当时就想,有没有什么方法,能初始化模型对象的时候将table属性赋值呢,这个值存在数据库里。这样就可以动态的来控制这个模型关联的表名了。

模型初始化

基于以上的需求,文档里的模型初始化引起了我的注意

tp5文档

我感觉这是我要找的东西。紧接着我着手开始测试

首次测试

我根据手册的写法,在调用父类初始化后面,写上对table的初始化,那么现在我们来打印出来实例化的order模型

打印实例化对象

从图中大家可以发现,table属性的确已经修改了。然后我就没有再做更多的测试了,因为我试过手动将table数据改为别的表名,就可以修改模型所关联的数据表。我想这个table属性已经有了肯定就没问题了。

直到我在这个模型里写了很多方法后,我想去回来换个表名来试试写入数据。爆炸的事情出现了。

      //我使用包含table属性的对象去查数据库。查询出来的结果,居然任然是原来那个模型名对应的表$order = new \app\API\model\Order();return $order->select();

这就很爆炸了,我已经写好的这么多代码难道都不能用了?

冷静下来之后,我决定先试试,手动在模型中该表table属性来试试。

直接修改模型的table属性

那么我们再来访问下呢?

image.png

报错,报表不存在,这是正确的,因为我没有建立order_1这个表。不过这也说明了,order模型的确已经和order_1表关联起来了。这样就让我摸不着头脑了。以前学习面向对象那些理论又浮现在我们脑海里。我梳理了下思路

  1. order模型中定义table属性,其实是对父类Model中的table的重写。并且table属性是一个protected的。那么就是说,只有在模型内部或则子类中可以使用和修改
  2. 在实例化模型的地方是控制器,也就是类的外部,理论上外部是对象只能读取和操作类中public的属性的
  3. 可是initialize又是在实例化模型自动触发的方法,触发的地方又是在模型的内部。
  4. 但是我又是使用$this 又是指代我控制器中的被实例化出来的模型对象。那是不是还是不能访问被保护的属性呢?
    好了瞎分析完了之后,我决定还是去网上搜索下,看看有没有人和我一样的应用场景。后来我发现,使用模型初始化的人,似乎很少。少数几篇博客讲解了下。其中有个应用场景和我类似。他在代码中是这样写的
    protected function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->table('order_1');//假装这里名字是从数据库里取得}

我通过IDE的智能感知,进入套table方法中,看了下注释

image.png

看样子是我需要的方法,可这个方法不是模型基类里的啊,是在query类当中的。我有些摸不清楚头脑,但不管怎样,还是要试一试

为了让代码不报错,我去增加了一个order_1表。这一试,嘿嘿,搞定了!

image.png

打印出了我在新表中的一条数据。哈哈,看来这个思路是可行的

就在我认为这个思路是可行的时候,我在执行我写好的一些模型方法时,我发现了一个大坑!!

我就不详细说我是怎么发现的了。直接看代码
模型里我还是这么写的

    protected function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->table('order_1');//假装这里名字是从数据库里取得}
        //控制器里实例化模型后,调用count方法$order = new \app\API\model\Order();var_dump($order->count());var_dump($order->count());die;

结果让人非常的震惊!

结果

同一个对象,调用同一个方法,结果居然不一样!我反复试过都是这样。我决定将他们的sql打印出来看看有什么问题

image.png

结果同样是让人哭笑不得

image.png

结果模型初始化是一次性的?(黑人问号.jpg)

我当时就觉得是tp5的bug,我要向作者反应!

后来我冷静下来,还是先把项目问题解决了来再说哦。饭碗要紧。

最终经过我的摸(luan)索(gao) ,我找到解决方案。下面就把代码贴出来,但是我确实不知道怎么解释这个问题。也希望大神能够指出,感激不尽

   protected function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->name('order_1');//将table方法换位name方法}

name方法是也是指定表名,只是不带表前缀。经测试,传入不含表前缀的表名可行,我这里的数据表设计的时候没有表前缀,所以传的都一样。

那么改过之后,再来打印下之前的sql

image.png

经测试可以正常切换两个表~

本次博客只在记录,内容中有很多自己瞎猜的,站不住脚,让大神见笑。非常希望能有大神指点

TP5_模型初始化_踩坑记录相关推荐

  1. burp 调试_踩坑记录——使用Burp抓取网易MuMu的数据包

    最近有分析APP数据包的需求,在配置环境过程中踩了几个坑,在此记录一下. 1. 环境准备 1.1 安装网易MuMu 默认配置安装即可. 1https://mumu.163.com/ 1.2 安装ADB ...

  2. mysql两条记录合成一条数据_踩坑记录之csv数据导入MySQL

    可能采坑的操作 将excel表格转换成csv 逗号分隔,然后notepad检查文件是否是utf8编码,保存. 打开 phpMyAdmin , 选择要导入的表格,然后点击导入: 导入设置 点击执行之后, ...

  3. alpine初始化配置和踩坑记录

    alpine初始化配置和踩坑记录 目录 alpine初始化配置和踩坑记录 开启root登录SSH 官方配置工具 修改DNS和apk源 设置时区 解决console字体太小并添加中文字体 参考文献 开启 ...

  4. TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...

  5. sonar覆盖率怎么统计的_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(上)...

    本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 一.概述 测试覆盖率是老生常谈的话题.因为我测试理论基础不是很好,这里就不提需求.覆盖率等内容,直奔主 ...

  6. 关于原神沙漠痕迹效果的踩坑记录

    --因为个人之前活动的平台缺乏有营养的可以促进双方思考与进步的评论(毕竟平台的主打内容和用户群体不同),所以思考(与自己的懒惰做斗争)过后,技术相关的文章以后还是来知乎或CSDN之类专业性比较强的平台 ...

  7. 日常踩坑记录-汇总版

    开发踩坑记录,不定时更新 心得 RTFM 严谨的去思考问题,处理问题 严格要求自己的代码编写习惯与风格 注意 单词拼写 20200207 mybatis plus 自带insert插入异常 sql i ...

  8. 【学习记录】QT5界面设计的踩坑记录

    学习记录:QT5 界面设计的踩坑记录 前言 一.Qlabel显示视频与图片 1. 图片显示 1.1 显示格式 1.2 label随界面缩放 1.3 界面刷新 2. 视频显示 二.常见控件的StyleS ...

  9. 微软NNI进行神经网络模型剪枝压缩的踩坑记录

    微软NNI进行神经网络模型剪枝压缩的踩坑记录 NNI进行模型剪枝分类 NNI剪枝的流程 NNI现有剪枝方法 剩下的剪枝操作比较复杂还没有研究透,不过应该大同小异,有机会继续研究更新. 最近做毕设嵌入式 ...

最新文章

  1. 深度学习-智能视频监控
  2. Python基础笔记1
  3. suse11 oracle11g 安装
  4. leetcode-7-整数翻转
  5. 专业计算机能力考试 技巧,全国专业技术人员计算机应用能力考试应试技巧
  6. find命令过滤 no such_运维老手常用的linux命令操作
  7. 硬件知识:电脑硬盘的数据保护与恢复,新手必备的知识!
  8. Python之%s%d%f使用实例
  9. Python | 面试必问,线程与进程的区别,Python中如何创建多线程?
  10. p=(1 r) 2c语言编程,菜鸟编程~!1.2
  11. tensorflow-gpu_tensorflow GPU环境安装踩坑日记
  12. angular js 使用pdf.js_胶水(框架) Stencil.js
  13. Eclipse基础--java环境变量设置
  14. hexo添加_hexo 如何给文章添加目录
  15. Python抓取妹子图
  16. 国内外sns源码搜集
  17. 幼儿园故事导入语案例_幼儿园活动教案导入语
  18. Win10下修改git全部配置文件方法
  19. 这10个实用网站/app,至少让你的效率翻一倍!
  20. matlab object是什么意思,求大神指导一下代码大概是什么意思。。

热门文章

  1. 枚举enum与#define 宏的区别?
  2. 常考数据结构与算法:最小的k个数
  3. mybaits二十二:一级缓存失效的几种情况
  4. Sql Server 得到当月第一天
  5. react useRef()函数
  6. 如何在阿里云上使用Data Lake Analytics分析Table Store数据
  7. ignite自定义函数
  8. 开源性能测试工具JMeter快速入门(一)
  9. alias提升效率工具
  10. Pycharm安装pip pip安装第三方模块