
CodeIgniter 4 中使用多个下拉框进行条件搜索时,若模型未正确返回查询结果数组,视图将始终收不到数据导致“无结果”——根本原因在于 get() 返回的是 ResultInterface 对象,需显式调用 getResult() 才能获取可遍历的对象数组。
codeigniter 4 中使用多个下拉框进行条件搜索时,若模型未正确返回查询结果数组,视图将始终收不到数据导致“无结果”——根本原因在于 `get()` 返回的是 `resultinterface` 对象,需显式调用 `getresult()` 才能获取可遍历的对象数组。
在 CodeIgniter 4 的搜索功能开发中,一个常见但容易被忽略的问题是:控制器调用模型方法后,视图中 foreach($search as $properties) 循环始终不执行,即使数据库中存在匹配记录。其根源并非逻辑错误或 SQL 构建失败,而是模型层对查询结果的处理方式不正确。
如原代码所示,HomeModel::getSearch() 方法中:
$result = $builder->get(); return $result; // ❌ 返回 ResultInterface 实例,非数组/对象集合
$builder->get() 返回的是实现了 ResultInterface 的结果对象(如 MySQLiResult),它本身不可直接用于 foreach 遍历。必须通过其提供的结果转换方法(如 getResult()、getResultArray() 或 getRow())提取实际数据。
✅ 正确做法是:
将模型中的返回语句改为:
// Home Model - 修正后的 getSearch() 方法
public function getSearch($params) {
$category = $params['category'] ?? '';
$area = $params['area'] ?? '';
$bedrooms = $params['bedrooms'] ?? '';
$washrooms = $params['washrooms'] ?? '';
$builder = $this->db->table('tblresidential');
$builder->select('*');
if (!empty($category)) {
$builder->where('category', $category);
}
if (!empty($area)) {
$builder->where('area', $area);
}
if (!empty($bedrooms)) {
$builder->where('bedrooms', $bedrooms);
}
if (!empty($washrooms)) {
$builder->where('washrooms', $washrooms);
}
// ✅ 关键修正:调用 getResult() 获取对象数组
return $builder->get()->getResult();
}
? 补充说明:
- getResult() → 返回 stdClass 对象数组(推荐,与视图中 $properties->id 等写法完全兼容);
- getResultArray() → 返回关联数组(需改用 $properties['id']);
- 同时建议使用空合并运算符 ?? '' 替代 != '' 判断,避免未设置键名时触发 Notice;
- where('1 = 1') 是冗余操作,可安全移除,CodeIgniter 查询构建器默认支持链式 where 条件追加。
此外,为增强健壮性,可在控制器中添加简易日志或调试输出:
// Home Controller - 可选调试
log_message('debug', 'Search params: ' . json_encode($params));
log_message('debug', 'Search result count: ' . count($data['search']));
最后,请确保数据库字段名(如 category, area, bedrooms, washrooms)与表 tblresidential 中真实列名严格一致(区分大小写,尤其在 Linux 环境下),并验证各下拉框
完成上述修正后,搜索结果即可正常渲染到 search.php 视图中, 将正确迭代数据,彻底解决“空白结果页”问题。










