CI框架在模型中切换读写库和读写库
如果你想在控制器中切换在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());
}
}
CI框架在模型中切换读写库和读写库的更多相关文章
- CI框架在控制器中切换读写库和读写库
CodeIgniter框架版本:3.1.7 ,php版本:5.6.* ,mysql版本:5.6 在Ci框架中,可以在application/config/database.php中配置多个group, ...
- CI框架在辅助函数中使用配置文件中的变量
问题: 现有一个自定义的辅助函数,想要获取配置文件中的配置项(配置文件路径为application/config/config.php) 分析: 辅助函数并不是定义在一个class中,而是很多个可供外 ...
- 二十二、CI框架之模型别名
一.在控制器中调用模型时,可以给模型取别名,之后调用时,调用别名就可以了 二.界面显示如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477 ...
- 去掉CI框架默认url中的index.php
1:.htaccess //放置在根目录下,和入口文件index.php的同级目录<IfModule mod_rewrite.c>RewriteEngine onRewriteCond % ...
- CI框架--数据库Query_Builder中的方法
下面是DB_Query_Builder.php中,各个方法的声明: 选择字段(select) public function select($select = '*', $escape = NULL) ...
- 用CI框架向数据库中实现简单的增删改查
以下代码基于CodeIgniter_2.1.3版 用PHP向数据库中实现简单的增删改查(纯代码)请戳 http://www.cnblogs.com/corvoh/p/4641476.html Code ...
- CI 框架去掉url 中index.php的方法
1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...
- CI框架中,扩展验证码类。
使用CI框架的朋友,应该都知道CI框架的的验证码辅助函数,不太好用.它需要写入到数据库中,然后再进行比对. 大家在实际项目中,好像不会这样去使用,因为会对数据库造成一定的压力. 所以,我们还是利用se ...
- CI 框架中的自定义路由规则
在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...
随机推荐
- Windows 系统下 mysql workbench 的安装及环境配置
1.MySQL的官网地址:https://www.mysql.com/ 2,选择DOWNLOADS 3.选择community 再MySQL workbench 4.安装MySQL workbench ...
- oracle 分组函数执行分析
先上例了: select job as "JOB1", avg(sal) as "avg sal" from scott.emp group by " ...
- SpringBoot实现热部署(修改class不需要重启)
热部署: devtools可以实现页面热部署(即页面修改后会立即生效, 这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实 ...
- [福大软工] Z班 第2次成绩排行榜
作业链接 http://www.cnblogs.com/easteast/p/7469291.html 评分细则 本次个人项目分数由三部分组成,分别是 (1)博客 - 20分,分数组成如下: 在文章开 ...
- 分布式UUID的生成
背景 最近有个项目:涉及到分布式计算,tps相对较高,流程之间是异步调用,流程间相互依赖的对象(涉及记录外键)需要持久化.这就衍生出了需要在JVM中快速生成分布式UUID的问题 方案 1.通过JDK标 ...
- Ant Design Pro的dva-loading
loading为dva的插件,全局可用,它里面维护了一些布尔值,用于控制loading动画效果的显示与隐藏,通过@connect()来注入使用 官网介绍如下: https://dvajs.com/ 在 ...
- (转)Spring Boot (十三): Spring Boot 小技巧
http://www.ityouknow.com/springboot/2017/06/22/spring-boot-tips.html 一些 Spring Boot 小技巧.小知识点 初始化数据 我 ...
- 使用IntelliJ IDEA和Maven管理搭建Web开发环境(以Spring MVC为例)(一)
前言:原来一直使用MyEclipse,换工作后,新公司使用IDEA,初识IDEA发现,哇,它的快捷键可真多啊,但是一路用下来,觉得非常的好用,特别是利用Maven管理,那简直叫一个爽.当然笔者在使用过 ...
- About Swift
Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective ...
- 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别
数据库事务的四大特性以及事务的隔离级别 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...