PHP中如何将过滤后的数据库查询数据推入指定数组变量
问题说明
你当前的代码存在3个核心错误,导致无法实现预期的筛选效果:
- 混淆了查询构造器实例和最终查询结果:
$this->db->table()返回的是用于拼接SQL语句的查询对象,不是已经从数据库取出的数据集,不存在“把过滤后的数据推入另一个变量”的操作基础。 - 重复实例化查询对象:第二个if分支前重新调用
table()方法生成了全新的查询实例,前一个分支绑定的查询条件会被完全重置。 - 条件分支是覆盖逻辑而非追加逻辑:两个if分支都是直接给
$newRow赋值,当两个开关同时开启时,后一个分支的条件会完全覆盖前一个,无法实现多条件匹配。
实现方法
根据你的性能需求选对应方案即可:
方案1:查询层筛选(推荐,性能最优)
直接在查询构造器上按需追加筛选条件,最后一次性执行查询取结果,避免拉取全表无用数据:
// 初始化查询实例 $dataQuery = $this->db->table(self::TABLE_NAME); $targetStatus = []; // 按需收集要匹配的状态值 if ($showActiveOnly == 1) { $targetStatus[] = 'dodano'; } if ($showNotAdded == 1) { $targetStatus[] = 'nedodano'; } // 有筛选规则就追加where条件,无规则则查询全表 if (!empty($targetStatus)) { $dataQuery->whereIn('status', $targetStatus); } // 执行查询拿到最终结果集 $newRow = $dataQuery->get();
如果两个开关是互斥关系(同一时间只会有一个为1),可以直接在分支里给查询对象追加where条件,不需要用数组收集状态值,注意不要重复实例化table对象即可。
方案2:内存层筛选(适合小数据量表)
如果你确实需要先取出全量$rows数据,再在内存中过滤后推入结果集,可以用遍历判断的方式实现:
// 先取出全表数据 $rows = $this->db->table(self::TABLE_NAME)->get(); // 初始化结果集 $newRow = []; foreach ($rows as $singleRow) { $isMatched = false; if ($showActiveOnly == 1 && $singleRow['status'] === 'dodano') { $isMatched = true; } if ($showNotAdded == 1 && $singleRow['status'] === 'nedodano') { $isMatched = true; } // 符合条件就推入结果集 if ($isMatched) { $newRow[] = $singleRow; } }
内容的提问来源于stack exchange,提问作者markiv
相关产品推荐
相关产品推荐

