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

PHP向数组追加查询对象时覆盖数组、fetchAll报错如何解决

问题根源

你的实现思路从根上错了,完全不需要把查询构造器对象往数组里塞。

  • 循环内直接给$newRow赋值查询构造器对象,每次都会覆盖之前的内容;就算真把多个查询对象存进数组,数组本身没有fetchAll()方法,强转成stdClass通用对象也不会自带查询类的方法,必然抛出Call to undefined method stdClass::fetchAll()错误。
  • 多状态筛选的正确逻辑是基于同一个查询构造器实例组装查询条件,把需要匹配的多个状态用WHERE IN或者分组OR的规则写入查询语句,最后返回这一个查询实例,就能正常调用fetchAll()拿到结果。
  • 另外你原代码里filter方法的参数showHalfAdded漏了$符号,本身就有语法错误,修复的时候要一起补上。
可直接运行的修复代码

修正后的filter方法逻辑如下,不需要改动getFiltered方法:

public function filter($showActiveOnly, $showNotAdded, $showHalfAdded, $showDeclined)
{
    // 初始化基础查询对象,不要创建空数组
    $query = $this->db->table(self::TABLE_NAME);
    $selectedStatuses = [];
    
    $statuses = [
        'dodano' => $showActiveOnly,
        'nedodano' => $showNotAdded,
        'casdodano' => $showHalfAdded,
        'storno' => $showDeclined,
    ];

    // 收集所有需要匹配的状态值
    foreach ($statuses as $status => $addFilter) {
        if ($addFilter) {
            $selectedStatuses[] = $status;
        }
    }

    // 选中了至少一个状态时,加状态筛选条件;未选中则返回全量查询
    if (!empty($selectedStatuses)) {
        $query->whereIn('status', $selectedStatuses);
    }

    return $query;
}

如果用的框架查询构造器不支持whereIn语法,可以换成分组OR条件实现,逻辑完全等价,还能避免和其他查询条件出现逻辑冲突:

if (!empty($selectedStatuses)) {
    $query->where(function ($subQuery) use ($selectedStatuses) {
        foreach ($selectedStatuses as $idx => $status) {
            if ($idx === 0) {
                $subQuery->where('status', $status);
            } else {
                $subQuery->orWhere('status', $status);
            }
        }
    });
}
原写法无效的核心原因
  • array_push、强制类型转换的操作,本质是把多个独立的查询对象存到数组或者转成无方法的通用stdClass对象,这两种结构都没有继承查询构造器的fetchAll方法,调用就会报错。
  • 直接赋值的写法每次循环都会把变量替换成新的查询实例,之前循环组装的条件会全部丢失,最后只会保留最后一个开启的筛选条件,根本无法实现多状态同时筛选的需求。

内容的提问来源于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 14:48:21