视图单个foreach循环调用两模型方法报错:Trying to get property of non-object
解决 "Trying to get property of non-object" 错误
首先咱们直接定位问题根源:你在视图里直接调用 $data3->PLO_weightage,但**$data3 并不是单个对象,而是一个对象数组**——你的模型方法 max_weightage_assign 使用了 group_by('PLO_id'),返回的是 query->result()(多条记录的集合),而非单个对象,这就是触发错误的核心原因。
另外你需要把 $data2(所有PLO基础数据)和 $data3(对应PLO的权重总和)通过 PLO_id 关联起来,这样遍历每个PLO时,才能拿到对应的权重上限值。
步骤1:调整控制器,把$data3处理为按PLO_id索引的数组
我们可以在控制器里将$data3转换成以PLO_id为键的数组,方便后续快速匹配:
public function assign_PLO($subj_session) { $data['data'] = $this->portal->assign_subject_teacher_PLO($subj_session); $data['data2'] = $this->PLO->PLO_detail(); // 把$data3转换为以PLO_id为键的关联数组 $raw_weight_data = $this->portal->max_weightage_assign($subj_session); $data['data3'] = []; if($raw_weight_data) { foreach($raw_weight_data as $item) { $data['data3'][$item->PLO_id] = $item->PLO_weightage; } } $this->load->view('Teacher/Header'); $this->load->view('Teacher/PLO_subj_assign', $data); $this->load->view('footer'); }
(这里我把分散的$data和$data2合并成一个数组,代码更简洁)
步骤2:修改视图代码,关联PLO_id获取对应权重
现在遍历$data2时,通过当前PLO的PLO_id去$data3数组里匹配对应的权重值:
<div class="col-md-12 text-center"> PLO Assign <hr> <div class="row" > <?php if (!empty($data2)) { foreach ($data2 as $tab) { // 获取当前PLO对应的权重总和,没有数据则设默认上限(比如100) $max_weight = isset($data3[$tab->PLO_id]) ? $data3[$tab->PLO_id] : 100; ?> <div class=" col-md-4 text-left"> <div class="form-group alert alert-dark"> <div class="form-check"> <input class="form-check-input" value="<?php echo $tab->PLO_id;?>" name="assign_PLO[]" type="checkbox" id="gridCheck_<?php echo $tab->PLO_id;?>"> <label class="form-check-label" for="gridCheck_<?php echo $tab->PLO_id;?>" > <?php echo $tab->PLO_name;?> </label> <input class="form-control" type="number" name="assign_wt[]" max="<?php echo $max_weight; ?>" min="1"> </div> </div> </div> <?php } } ?> </div>
额外提醒:我给每个checkbox的id加了$tab->PLO_id后缀,避免多个checkbox的id重复(原来的id="gridCheck"会导致label点击失效)。
可选优化:模型方法的可读性调整
你的max_weightage_assign方法里,select_sum('PLO_weightage')和select('PLO_weightage')同时存在有点冗余,建议给求和字段起别名,让代码更清晰:
public function max_weightage_assign($subj_session) { $this->db->select_sum('PLO_weightage', 'total_weightage'); // 给求和字段起别名 $this->db->where('session', $subj_session); $this->db->group_by('PLO_id'); $query = $this->db->get('plo_data'); return $query->num_rows() > 0 ? $query->result() : false; }
如果用了别名,控制器里的处理也要对应改成:
$data['data3'][$item->PLO_id] = $item->total_weightage;
这样修改后,既解决了非对象的错误,也能正确为每个PLO匹配对应的权重上限了。
内容的提问来源于stack exchange,提问作者Ahsan Abdul Salam
相关产品推荐
相关产品推荐

