You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:48:16