CI框架在模型中切换读写库和读写库
框架 模型 切换 读写 CI
2023-09-14 08:56:53 时间
如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库
如果你是希望在模型中切换group,那么就不要像在控制器中那样做,比如这样:
<?php class Hello_model extends CI_Model{ public function getInfo(){ $this->db = null; $this->load->database("read"); $res = $this->db->query("select * from t1"); print_r($res->result_array()); } } ?>
一旦调用Hello_model中的getInfo方法的话,程序就会出错,比如报如下信息的错误:
Message: Call to a member function query() on null
这个信息无非就是说$this->db是null,切换group失败了。
咱们来看一下源码是什么样的:位置在system/core/loader.php中,定位到database,如下:
<?php class CI_Loader { /** * @param mixed $params 数据库配置选项 * @param bool $return 是否返回database对象 * @param bool $query_builder 是否开启query builder */ public function database($params = '', $return = FALSE, $query_builder = NULL) { // 获得CodeIgniter 对象 $CI =& get_instance(); // 检测是否需要加载database对象 if ($return===FALSE && $query_builder===NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id)){ return FALSE; } require_once(BASEPATH.'database/DB.php'); if ($return === TRUE){ return DB($params, $query_builder); } //初始化$CI->db,也就是$this->db,防止发生引用错误 $CI->db = ''; // 加载DB类 $CI->db =& DB($params, $query_builder); return $this; } }
观察执行过程:
- Hello_model中的因为$this->db=null,那么执行$this->load->database("read")时,进行到上面的第13行,$CI指向了CodeIgniter对象,
- 但是进行if判断时,前面几个都为true,但是isset($CI->db)为false,因为前面已经设为null了,
- 所以继续下面的require_once,再进行判断,$return为fase,于是跳过,执行$CI->db = '';
- 然后又尝试进行创建db,返回一个引用,注意这里是一个对象实例的引用;而如果上一步的$return为true时,则返回一个db的对象示例。
- 最后返回CI_loader本身。也就是说,不管传不传参数$return,都会返回值。
这个时候,please在Hello_model中尝试打印一下load_database()的返回值
<?php class Hello_model extends CI_Model{ public function getInfo(){ echo '不传$return,默认为false'; $this->db = null; print_r($this->load->database("read"));//输出为空 echo '传$return=true'; $this->db = null; print_r($this->load->database("read",true)); //输出CI_DB_mysqli_driver Object } }
上面代码有两次打印,但是只有第二次打印了一个CI_DB_mysqli_driver Object,至于第一次打印为什么是空,我也没搞明白,也没时间去看了。
但是查看打印出来的CI_DB_mysqli_driver Object,就会发现,切换到read group 成功了,也就是说,可以用一个值来接收$this->load->database("read",true)的返回值,
然后,没错,可以使用$this->db来接收,然后其他的和以前没两样。如下:
<?php class Hello_model extends CI_Model{ public function getInfo(){ $this->db = null; $this->db = $this->load->database("read",true); //输出CI_DB_mysqli_driver Object //使用read group中 exam数据库的tt表 $res = $this->db->query("select * from tt"); print_r($res->result_array()); } public function otherInfo(){ //使用write group中 test数据库的t1表 $res = $this->db->query("select * from t1"); print_r($res->result_array()); } }
相关文章
- Python开发框架Flask
- UIKit 框架之UIDatePicker
- 第二百六十七节,Tornado框架-分页封装模块
- OpenYurt 之 Yurthub 数据过滤框架解析
- django框架进阶-分页-长期维护
- c# 框架系列 ———— EFCore 模型篇 [一]
- keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)
- Go语言web框架beego:目录说明
- [ASP.NET Core 3框架揭秘] Options[4]: Options模型[下篇]
- [ASP.NET Core 3框架揭秘] 依赖注入[6]:服务注册
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]
- iOS (swift,oc)字典转模型(一)框架 YYModel HandyJSON
- CV之IC之VGG16:基于Keras框架利用卷积神经网络VGG16算法的迁移技术实现猫狗分类识别(图片数据增强→保存h5模型)案例训练过程记录
- DL:基于keras和tensorflow 框架保存网络结构/网络拓扑图/网络模型(json、yaml、h5等文件)注意事项及代码实现(保存和加载.h5模型文件案例)之详细攻略
- CV之IC之AlexNet:基于Keras框架利用卷积神经网络类AlexNet算法实现猫狗分类识别(图片数据增强→保存h5模型→加载模型)案例应用
- CV之IC:基于Keras框架利用mini_XCEPTION算法实现训练性别分类hdf5模型导出并保存到指定文件夹下代码实现
- CV之FR:基于Keras框架利用训练好的hdf5模型直接进行人脸识别推理(cv2自带两步检测法)实现对《跑男第六季第五期》之如花视频片段(或调用摄像头)进行实时性别、脸部表情识别
- ML之RF:基于葡萄牙银行机构营销活动数据集(年龄/职业/婚姻/违约等)利用Pipeline框架(两种类型特征并行处理)+RF模型预测(调参+交叉验证评估+模型推理)客户是否购买该银行的产品二分类案例
- TF之Transformer:基于tensorflow和Keras框架(特征编码+Tokenizer处理文本+保存模型)针对UCI新闻数据集利用Transformer算法实现新闻文本多分类案例
- DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)
- Python Flask框架学习23:Flask Sijax
- 开源网络抓包与分析框架学习-Packetbeat篇
- Spring框架学习之第2节
- Django 框架简介
- pytest接口自动化测试框架 | 重新运行失败用例
- 深入浅出Flask(9):调试H-ui前端框架一点心得
- cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
- jQuery 和其他 JavaScript 框架
- golangWeb框架---github.com/gin-gonic/gin学习八(监听多端口、多类型的struct模型绑定)
- go中gin框架+realize实现边写代码边编译,热更新
- detectron2(目标检测框架)无死角玩转-10:源码详解(6)-anchor的使用,loss计算
- TensorFlow:实战Google深度学习框架(一)计算、数据、运行模型
- DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)
- CV之FR:基于Keras框架利用训练好的hdf5模型直接进行人脸识别推理(cv2自带两步检测法)实现对《跑男第六季第五期》之如花视频片段(或调用摄像头)进行实时性别、脸部表情识别
- 【项目实战】基于定时任务框架XXL-JOB实现定时每天发送周年祝福人员