用户
 找回密码
 入住 CI 中国社区
搜索
查看: 15157|回复: 10
收起左侧

[模型] codeigniter model 里面 无法调用其他model 的问题 解决方法

[复制链接]
发表于 2010-3-9 17:27:52 | 显示全部楼层 |阅读模式
昨天晚上 稀里糊涂 弄了几个model , 然后 在 一个model 里面调用其他model

发现 在model 里 调用其他model  无效 ?

(注: 运行环境 apache 2.2  ,   php 5.2.3 )

也就是说 在model 里面 ,   一个 方法(fun)中    写下  $this->load->model('xxxmodel')   ;     $this->xxxmodel->xxxfun()   , 会报错  找不到 xxxfun 方法;

起先以为 眼睛迷糊, 写错方法, 但是 多次尝试, 还是一样 ,  codeigniter 手册里面好像也没有说,  model 里面不能调用其他model  ;

这问题今天问了 HEX , 他说目前codeigniter 是有这个问题;

分析了 ci 的代码, 看似也没什么问题,.  上厕所时 , 考虑了一下 可能是php 对象的实现机制的问题;

进一步分析发现 找不到 xxxfun  方法  是没有 创建 xxxmodel 对象. 分析php 对象机制,  发现(可能)由于 php 引用 对象有延迟 的现象;

既然这样, 那么就可以用如下方法解决:

在需要 A model  调用 B  model  时 , 在   A model 的   构造函数(__construct)  中 预先加载B model ( $this->load->model('B model') )

然后 就可以 在 B model  的 方法中 使用  $this->B model->fun()  调用 B model 的方法了;


完毕;
发表于 2010-3-9 17:32:16 | 显示全部楼层
也可以在模型中用 get_instance() 解决
发表于 2010-5-19 10:57:38 | 显示全部楼层
嗯,好办法
但是很奇怪,我昨天写的第一个在方法里调用就可以,结果后来写的就总是提示错误,改在构造函数里加载就好了,太邪门了
发表于 2010-5-19 12:50:08 | 显示全部楼层
回复 1# xluohome

我以前也用过这种方法,有的时候可以,有的时候却不可以。
推荐用get_instance()
发表于 2010-7-9 21:08:16 | 显示全部楼层
我在config/autoload.php预先加了一个公共model,
公共model类,却是可行的。。。
挺稳定的
没发现你们说的问题
发表于 2010-7-16 00:22:06 | 显示全部楼层
也被这个问题困扰了好久,

今天赫然发现,

在坚持不使用get_instance()的前提下,
如果需要在model(A_model)里调用另外一个model(B_model)里的方法

那么只要保证load->model(B_model) 在 load->model(A_model)之前(或者同时)发生就可以。
(同时发生就是指,在A_model的构造函数里load->model(B_model))

auto_load发生在controller和其他手动load之前,所以在大多数model里都可以调用auto_load进来的model里的方法

同样,在auto_load的时候,
如果是
$autoload['model'] = array('A_model','B_model');
那么B_model可以直接调用A_model的方法,反之则出错。。。。。


虽然还不太明白是什么道理,不过从使用上讲,大概就是这么个样子

有点乱,实在记不住先load的哪个model的话,就用get_instance()吧,哈哈哈

评分

参与人数 1威望 +3 收起 理由
Hex + 3 我很赞同

查看全部评分

发表于 2010-7-16 10:04:41 | 显示全部楼层
回复 6# BillyFan


    呵呵,从你说的来看,是有个装载先后顺序的,这个就和 include 一样,有先后关系。
发表于 2010-8-5 15:57:04 | 显示全部楼层
回复 1# xluohome


    但是modelB中不能有私有属性
发表于 2010-8-10 12:35:48 | 显示全部楼层
我是实用get_instance().呵呵。
发表于 2015-2-17 22:09:51 | 显示全部楼层
今天发现从一个model里调用另外一个model是可以调用的, 但是会死掉直接返回,现象像是数据库死锁超时,没有任何报错信息...
花了半天时间调查才发现是因为在model里load了另外一个model的缘故,
如果改成从contoller载入则不会有问题. 搜索到这里才得知也可以用get_instance解决.
考虑到model的db对象也是单例的, 恐怕这玩意栽在这个上面可能性很大,
ci应该给用户一个接口直接操纵配给连接对象

本版积分规则