如果你想在控制器中切换在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. redis常用命令及结构

    ##常用结构及命令: keys * #查询所有key randomkey #随机返回key type key #返回key的类型 exists key #判断key是否存在 del key1 key2 ...

  2. February 21st, 2018 Week 8th Wednesday

    Our life is what our thoughts make it. 我们的思想成就了我们的生活. The mind is everything. What you think, you be ...

  3. Navicat Premium 12.0.29 / 12.1.5.0安装与激活

    转自:https://www.jianshu.com/p/5f693b4c9468 本文介绍Navicat Premium 12.0.29和Navicat Premium 12.1.5.0的安装.激活 ...

  4. 基于BeautifulSoup库的HTML内容的查找

    一.BeautifulSoup库提供了一个检索的参数: <>.find_all(name,attrs,recursive,string,**kwargs),它返回一个列表类型,存储查找的结 ...

  5. 在Ubuntu18.04上使用Anaconda

    启动Anaconda Navigator 图形化界面 $ source ~/anaconda3/bin/activate root $ anaconda-navigator 查看目前的conda版本: ...

  6. BZOJ4327:[JSOI2012]玄武密码(SAM)

    Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  ...

  7. 想要快速上手 Spring Boot?看这些教程就足够了!

    1.项目名称:分布式敏捷开发系统架构 项目简介:基于 Spring + SpringMVC + Mybatis 分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中权限管理(单点登录).内容管理. ...

  8. 【转】PHP获取重定向URL的几种方法

    有时候我们会在开发中,经常会遇到有URL 301或 302重定向的情况,这时候我们可能需要获取重定向之后的url,下面我们介绍一下几种获取重定向url的方法: 1.用get_headers函数php自 ...

  9. APP耗电量测试

    现象 APP耗电,导致电池续航能力不佳,如下图,在小米MIX2和iPhone X机型上后台静默一小时各应用的耗电排行: 基本概念 相对于PC来说,移动设备的电池电量是非常有限的,保持持久的续航能力尤为 ...

  10. face recognition[翻译][深度学习理解人脸]

    本文译自<Deep learning for understanding faces: Machines may be just as good, or better, than humans& ...