无法从get_material()返回的data数组中获取unit_id的技术求助
解决从get_material()获取unit_id时while循环的问题
我之前也踩过类似在循环处理模型返回数据的坑,结合你描述的场景——在manufacture控制器的add_product()里调用get_material()从product_modal拿数据,要提取unit_id但while循环出问题,且add_product()本身能正常提交数据——咱们一步步来定位解决:
1. 先确认get_material()的返回数据结构
这是最常见的问题根源,不同的数据库操作方式(原生PDO、框架ORM/模型)返回的数据类型完全不同,直接用while循环可能不适用:
- 如果是原生PDO,模型返回的可能是
PDOStatement对象,这时候需要用fetch()配合while循环遍历:
// 在add_product()中调用后先获取结果集 $material_result = $this->product_modal->get_material(); // 用while循环遍历每一行 while ($material_row = $material_result->fetch(PDO::FETCH_ASSOC)) { $unit_id = $material_row['unit_id']; // 这里写入你的unit_id处理逻辑 }
- 如果是CodeIgniter/Laravel这类框架,模型如果用
result()返回的是对象数组,用get()返回的是集合,这时候更适合用foreach而不是while:
// CodeIgniter示例 $materials = $this->product_modal->get_material(); foreach ($materials as $material) { // 若返回的是对象则用->,数组则用['unit_id'] $unit_id = $material->unit_id; } // Laravel示例 $materials = ProductModal::get_material(); foreach ($materials as $material) { $unit_id = $material->unit_id; }
- 如果
get_material()只返回单条记录(比如用了row()/first()),那根本不需要循环,直接提取即可:
$material = $this->product_modal->get_material(); $unit_id = $material->unit_id; // 或$material['unit_id']
2. 验证unit_id字段是否存在且拼写正确
有时候问题很简单——字段名拼写错误(比如写成unitId、unit_ids),或者该字段在返回结果里不存在。你可以先打印返回数据确认:
$materials = $this->product_modal->get_material(); // 打印数据结构,确认是否有unit_id字段 var_dump($materials);
3. 排查循环内的逻辑问题
如果数据结构和字段都没问题,那可能是循环内的代码导致异常:
- 比如循环中修改了遍历变量,导致提前终止
- 比如某些记录的
unit_id为空,触发后续逻辑报错
可以加个判断跳过异常记录:
while ($material_row = $material_result->fetch(PDO::FETCH_ASSOC)) { // 跳过无unit_id的记录 if (!isset($material_row['unit_id']) || empty($material_row['unit_id'])) { continue; } $unit_id = $material_row['unit_id']; // 处理逻辑 }
总结
核心思路是先搞清楚get_material()到底返回了什么类型的数据,再匹配对应的遍历方式,而不是盲目用while循环。毕竟add_product()能正常提交,说明数据库连接和模型调用是没问题的,问题大概率出在数据遍历的环节。
内容的提问来源于stack exchange,提问作者cshine
相关产品推荐
相关产品推荐

