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
相关产品推荐
相关产品推荐

