如果你想在控制器中切换在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;
}
}

  观察执行过程:

    1. Hello_model中的因为$this->db=null,那么执行$this->load->database("read")时,进行到上面的第13行,$CI指向了CodeIgniter对象,
    2. 但是进行if判断时,前面几个都为true,但是isset($CI->db)为false,因为前面已经设为null了,
    3. 所以继续下面的require_once,再进行判断,$return为fase,于是跳过,执行$CI->db = '';
    4. 然后又尝试进行创建db,返回一个引用,注意这里是一个对象实例的引用;而如果上一步的$return为true时,则返回一个db的对象示例。
    5. 最后返回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());
}
}

  

CI框架在模型中切换读写库和读写库的更多相关文章

  1. CI框架在控制器中切换读写库和读写库

    CodeIgniter框架版本:3.1.7 ,php版本:5.6.* ,mysql版本:5.6 在Ci框架中,可以在application/config/database.php中配置多个group, ...

  2. CI框架在辅助函数中使用配置文件中的变量

    问题: 现有一个自定义的辅助函数,想要获取配置文件中的配置项(配置文件路径为application/config/config.php) 分析: 辅助函数并不是定义在一个class中,而是很多个可供外 ...

  3. 二十二、CI框架之模型别名

    一.在控制器中调用模型时,可以给模型取别名,之后调用时,调用别名就可以了 二.界面显示如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477 ...

  4. 去掉CI框架默认url中的index.php

    1:.htaccess //放置在根目录下,和入口文件index.php的同级目录<IfModule mod_rewrite.c>RewriteEngine onRewriteCond % ...

  5. CI框架--数据库Query_Builder中的方法

    下面是DB_Query_Builder.php中,各个方法的声明: 选择字段(select) public function select($select = '*', $escape = NULL) ...

  6. 用CI框架向数据库中实现简单的增删改查

    以下代码基于CodeIgniter_2.1.3版 用PHP向数据库中实现简单的增删改查(纯代码)请戳 http://www.cnblogs.com/corvoh/p/4641476.html Code ...

  7. CI 框架去掉url 中index.php的方法

    1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...

  8. CI框架中,扩展验证码类。

    使用CI框架的朋友,应该都知道CI框架的的验证码辅助函数,不太好用.它需要写入到数据库中,然后再进行比对. 大家在实际项目中,好像不会这样去使用,因为会对数据库造成一定的压力. 所以,我们还是利用se ...

  9. CI 框架中的自定义路由规则

    在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...

随机推荐

  1. NumPy 中的集合运算

    怎样快速找出两个数组中相同的元素? numpy.isin(element,test_elements,assume_unique = False,invert = False ) 计算test_ele ...

  2. SpringBoot实现热部署(修改class不需要重启)

    热部署: devtools可以实现页面热部署(即页面修改后会立即生效, 这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实 ...

  3. 查看linux中的TCP连接数

    一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议 ...

  4. 原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y

    关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种 event.clientX/Y event.pageX/Y event.offsetX/Y event.layerX/Y event.sc ...

  5. 【CQOI2006】凸多边形

    1713 -- [CQOI2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input ...

  6. Django-rest-framework 接口实现 权限:(Permission)

    权限:(Permission) rest_framework 中 已经定义好了 权限 在 from rest_framework.permissions 中查看所有的权限 from rest_fram ...

  7. centos下安装 glances 的问题

    开始想安装htop 然后 yum installhtop 没有 yum searchhtop 也没有  然后上github 发现一个比htop还华丽的东西. Glances 大概这个样子的. 可以一览 ...

  8. 解决不能再jupyter notebook中使用tensorflow

    在搭建cuda + Anaconda + tensorflow的开发环境时,在虚拟环境中的jupyter notebook启动后无法导入tensorflow.具体解决方案如下: 1.首先在虚拟环境中安 ...

  9. 「JOI 2016 Final」断层

    嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...

  10. 【转】解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮

    概述 在安卓开发中免不了需要播放一点音乐了,音频了.但是这时候有别的应用正在播放,这时候就会出现重音的现象,完全影响用户体验,我们的项目就遇上了这样的尴尬,然后查找了一些文档,记录一下: 管理音频焦点 ...