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

视图单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:29:59