xluohome 发表于 2010-3-9 17:27:52

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

昨天晚上 稀里糊涂 弄了几个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调用 Bmodel时 , 在   A model 的   构造函数(__construct)中 预先加载B model ( $this->load->model('B model') )

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


完毕;

Hex 发表于 2010-3-9 17:32:16

也可以在模型中用 get_instance() 解决

pipigui 发表于 2010-5-19 10:57:38

嗯,好办法
但是很奇怪,我昨天写的第一个在方法里调用就可以,结果后来写的就总是提示错误,改在构造函数里加载就好了,太邪门了

yunnysunny 发表于 2010-5-19 12:50:08

回复 1# xluohome

我以前也用过这种方法,有的时候可以,有的时候却不可以。
推荐用get_instance()

conqweal 发表于 2010-7-9 21:08:16

我在config/autoload.php预先加了一个公共model,
公共model类,却是可行的。。。
挺稳定的
没发现你们说的问题

BillyFan 发表于 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()吧,哈哈哈

Hex 发表于 2010-7-16 10:04:41

回复 6# BillyFan


    呵呵,从你说的来看,是有个装载先后顺序的,这个就和 include 一样,有先后关系。

ares333 发表于 2010-8-5 15:57:04

回复 1# xluohome


    但是modelB中不能有私有属性

dllhb 发表于 2010-8-10 12:35:48

我是实用get_instance().呵呵。

13822128 发表于 2015-2-17 22:09:51

今天发现从一个model里调用另外一个model是可以调用的, 但是会死掉直接返回,现象像是数据库死锁超时,没有任何报错信息...
花了半天时间调查才发现是因为在model里load了另外一个model的缘故,
如果改成从contoller载入则不会有问题. 搜索到这里才得知也可以用get_instance解决.
考虑到model的db对象也是单例的, 恐怕这玩意栽在这个上面可能性很大,
ci应该给用户一个接口直接操纵配给连接对象

页: [1] 2
查看完整版本: codeigniter model 里面 无法调用其他model 的问题 解决方法