CI4中可直接用select()实现字段筛选,需在findAll()前调用,支持字符串或数组传参;兼容where、orderBy等链式操作;动态筛选须白名单校验字段;复杂查询可切换Query Builder。

CI4(CodeIgniter 4)中实现“模型链式查询 + 数据表字段筛选”并不需要额外封装,直接利用内置的 select() 方法配合 Query Builder 即可完成。关键在于:字段筛选必须在 get() 或 findAll() 之前调用,且支持数组或逗号分隔字符串两种写法。
指定字段查询(避免 SELECT *)
默认 $model->findAll() 会查全部字段,但生产环境应显式声明所需字段,减少数据传输和内存占用。
- 使用字符串(字段名用逗号分隔,支持表别名):
$users = $userModel->select('id, name, email, status')->findAll(); - 使用数组(更清晰,推荐):
$users = $userModel->select(['id', 'name', 'email'])->findAll(); - 带表前缀或别名时(如多表联查):
$users = $userModel->select(['u.id', 'u.name', 'p.phone'])->from('users u')->join('profiles p', 'u.id = p.user_id')->findAll();
结合 where、orderBy 等链式操作
字段筛选与其他查询条件完全兼容,顺序无关紧要(除 get()/findAll() 必须在最后)。
- 基础组合示例:
$activeUsers = $userModel<br> ->select(['id', 'name', 'created_at'])<br> ->where('status', 'active')<br> ->orderBy('created_at', 'DESC')<br> ->limit(10)<br> ->findAll(); - 注意:若模型启用了软删除(
$useSoftDeletes = true),findAll()默认自动过滤已删除记录,字段筛选不受影响。
动态字段筛选(运行时决定查哪些字段)
适合 API 接口按需返回字段的场景,用变量拼接或条件判断控制 select() 参数。
- 根据请求参数动态选字段:
$fields = in_array($this->request->getGet('fields'), ['basic', 'full'])<br> ? ['id', 'name', 'email']<br> : ['id', 'name', 'email', 'updated_at', 'last_login'];<br><br>$data = $userModel->select($fields)->findAll(); - 安全提示:切勿直接将用户输入拼入
select(),务必白名单校验字段名,防止 SQL 注入或敏感字段泄露。
与原生查询或 Query Builder 混用
若需更复杂逻辑(如函数字段、子查询),可切换到 Query Builder 并保持链式风格:
- 例如查带计数的用户列表:
$builder = $db->table('users u');<br>$builder->select([<br> 'u.id',<br> 'u.name',<br> '(SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as order_count'<br>]);<br>$builder->where('u.status', 'active');<br>$result = $builder->get()->getResultArray(); - 注意:此时不再走模型层(不触发回调、验证等),纯 SQL 查询,性能高但失去模型封装优势。

















