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

Phalcon循环更新DrugOrder后集合返回[false,false,false]问题排查

问题分析与解决方案

你遇到的核心问题是Phalcon ResultSet(find()方法返回的集合对象)的遍历特性与toArray()方法的行为导致的:

  • 当你第一次通过foreach ($drug_order as $order)遍历集合后,ResultSet的内部指针会移动到末尾;后续再次遍历(第二个foreach)以及调用toArray()时,默认情况下ResultSet无法自动重置指针,导致尝试读取元素时返回false。
  • 另外,Phalcon的ResultSet::toArray()默认不会自动同步你修改并保存后的模型属性,它更偏向于返回查询时的原始数据集(除非手动刷新模型)。

解决方案

方案1:手动重置ResultSet指针

在调用$drug_order->toArray()之前,重置集合指针到开头,确保能重新遍历所有模型:

$drug_order->rewind(); // 将指针重置到集合起始位置
$this->base->logDev($drug_order->toArray());

方案2:收集修改后的模型数组(推荐)

在第一个遍历处理模型时,直接将修改后的模型数据存入新数组,后续日志直接使用这个数组,彻底避免依赖ResultSet的toArray():

$updatedOrders = [];
if ($drug_order && count($drug_order) > 0) {
    $discount = CF::toArray($discount);
    foreach ($drug_order as $order) {
        // ... 你的属性修改逻辑 ...
        
        if ($order->save() === false) {
            $messages = $order->getMessages();
            foreach ($messages as $message) {
                $this->base->logError($message, static::class, __LINE__);
            }
        } else {
            $orderArray = $order->toArray();
            $this->base->logDev($orderArray);
            $updatedOrders[] = $orderArray; // 收集修改后的模型数据
        }
    }
}

// 直接输出收集好的更新后数据
$this->base->logDev($updatedOrders);

方案3:设置ResultSet为可重用

在查询DrugOrder时添加'reusable' => true参数,让ResultSet支持多次遍历和自动指针重置:

$drug_order = DrugOrder::find([
    'conditions' => "resep_no = :resep_no: AND disposition= :disposition: AND hospital_id = :hospital_id:",
    'bind' => [
        'resep_no' => $resep_no,
        'disposition' => 'retur',
        'hospital_id' => $this->membership->houseID()
    ],
    'reusable' => true // 开启可重用特性
]);

额外验证建议

你可以在第二个foreach ($drug_order as $order)之前也添加$drug_order->rewind();,确保第二次遍历能正确获取模型对象,避免后续调用setUsedStockTransactionDisposition时出现异常。

内容的提问来源于stack exchange,提问作者M Jawahiruzzaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:14:52