codeigniter 3 中模型需继承 ci_model,文件名如 user_model.php、类名 user_model、加载用 $this->load->model('user_model');$this->db 须显式加载数据库;查询结果需调用 result() 或 result_array() 等方法获取数组。

CodeIgniter 3 中如何正确声明和加载 Model 类
Model 类必须继承 CI_Model,且文件名、类名、构造函数初始化方式三者不一致是 90% 的“模型找不到”或“方法调用失败”的根源。
- 文件必须放在
application/models/下,命名如User_model.php(下划线分隔,首字母小写) - 类名必须严格匹配文件名(不含
.php),且首字母大写:User_model→User_model类 - 构造函数里不要手动调用
parent::__construct()—— CodeIgniter 3 的自动加载机制会帮你完成;手动加反而可能触发重复初始化 - 加载时用
$this->load->model('user_model')(小写+下划线),不是User_model或user
为什么 $this->db 在 Model 里是 null?
因为 CodeIgniter 不自动把数据库实例注入 Model,你得显式获取或启用它。
- 在 Model 构造函数里加
$this->load->database(),之后才能用$this->db - 更推荐方式:在
application/config/autoload.php中把'database'加入$autoload['libraries']数组,全局可用 - 如果只在某个 Model 里用 DB,别在
__construct()外直接写$this->db->get()—— 此时$this->db还未初始化,会报Call to a member function get() on null
Model 方法返回结果的常见陷阱
CodeIgniter 的查询方法默认返回对象或对象数组,不是关联数组,这点常被忽略导致 foreach 报错或字段取不到。
-
$query = $this->db->get('users');返回的是CI_DB_result对象,不是数组 —— 必须用$query->result()(对象数组)或$query->result_array()(关联数组) -
$this->db->row()返回单个对象,$this->db->row_array()才返回单行关联数组;混用会导致Trying to get property 'name' of non-object - 执行插入后想拿自增 ID,别用
$this->db->insert_id()后立刻再查 —— 它只对上一次成功insert生效,且多线程下不安全;应确保插入成功后再调用
CodeIgniter 4 的 Model 写法完全不同,别套用 3 的习惯
CI4 的 Model 是独立类,继承 CodeIgniter\Model,不再依赖 $this->load->model(),也不放 application/models/ 下。
- 文件路径是
app/Models/UserModel.php,类名是UserModel(PascalCase,无下划线) - 不用手动加载,直接
new UserModel()或用服务定位器model('UserModel') -
$this->db不再存在,所有查询通过$this->table和内置方法(如findAll()、find())完成 - 如果你正在迁移项目,CI3 的
user_model.php和 CI4 的UserModel.php是两套体系,不能混用或简单重命名
最易被忽略的是:CI3 模型里写 $this->db->where() 很自然,但 CI4 里这行代码会直接报错 —— 因为没有 $this->db 属性,也没有全局 db 实例可链式调用。










