CI4模型需继承CodeIgniter\Model且不重写__construct(),文件放app/Models/下、类名与文件名一致;Active Record每次调用where等会重置状态;save()依$primaryKey存在与否判断增删改,主键非自增须设$useAutoIncrement=false。

CodeIgniter4 里模型类怎么写才不报错
直接继承 CodeIgniter\Model,别手写构造函数或手动加载数据库连接——CI4 的模型默认就带 $db 实例,且自动用配置里的默认组。
常见错误现象:Call to a member function query() on null,基本是因为你重写了 __construct() 却没调用 parent::__construct(),或者手动 unset 了 $this->db。
- 模型文件必须放在
app/Models/下,类名首字母大写,文件名和类名严格一致(如UserModel.php对应UserModel) - 不需要在模型里写
$this->db = \Config\Database::connect();,CI4 已帮你做了 - 如果要用非默认数据库组,用
$this->db = \Config\Database::connect('other_group');覆盖即可,但得在__construct()里调用parent::__construct()之后再赋值
Active Record 查询怎么写才不丢条件
CI4 的 Active Record 不是链式“累积式”设计,每次调用 select()、where() 等方法都会重置上一次的查询状态——除非你显式调用 get() 或 findAll() 触发执行。
典型翻车场景:写了两段 $model->where(...)->find(),第二段发现条件还是第一段的,其实是没清掉 $builder 缓存;更常见的是在循环里反复调用 where() 却没意识到 builder 是复用的。
- 每次完整查询建议用独立语句,比如
$model->where('status', 'active')->findAll(),别拆成多行再调find() - 需要复用 builder 逻辑?自己 new 一个:
$builder = $this->db->table('users');,然后链式操作,它不跟模型绑定 -
orLike()、notEqualTo()这类方法容易漏掉括号分组,复杂条件务必用groupStart()/groupEnd()包裹,否则 SQL 优先级出错
save() 方法为什么有时插不进数据,有时却更新失败
save() 不是万能插入/更新开关,它靠主键字段是否存在来判断动作类型——如果传入的数据数组里有主键(比如 'id' => 5),它走 UPDATE;没有主键,才 INSERT。但前提是:模型里必须正确设置 protected $primaryKey = 'id';。
常见坑:save(['name' => 'foo']) 返回 false 却不报错,大概率是主键字段名不对,或数据库里该字段设了 NOT NULL 但没给默认值,又没在模型里配 $useAutoIncrement = true。
- 确认
$primaryKey和数据库实际主键列名完全一致(区分大小写,尤其 MySQL 在某些配置下敏感) - 如果主键不是自增整数(比如 UUID 字符串),必须设
protected $useAutoIncrement = false; -
save()成功返回主键值(INSERT)或影响行数(UPDATE),失败返回false,记得用$model->errors()查具体原因
批量操作性能差?别直接 foreach 调 save()
循环里反复调 save() 会为每条记录发起一次 SQL 请求,100 条就是 100 次 round-trip。CI4 原生支持批量插入,但得绕过模型,直接用 Query Builder。
不是所有场景都适合 insertBatch():它不触发模型的 beforeInsert / afterInsert 回调,也不做字段过滤($allowedFields 不生效)。
- 要保留回调和字段白名单?老实用循环 +
insert(),但先关掉调试模式(CI_DEBUG = false),避免日志拖慢 - 纯数据导入且量大?用
$this->db->table('users')->insertBatch($data),$data是二维数组,键名必须和字段名一致 - MySQL 下超过 1000 行建议分批,单次
insertBatch()别超 500 条,不然可能触发max_allowed_packet错误
事情说清了就结束。模型这层看着轻,但主键配置、builder 复用、save 判定逻辑,三处任一搞错,查起来都像在猜谜。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











