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

Codeigniter3报Trying to get property of non-object 关联表数据无法全部显示

问题排查与解决方法

根因定位

你遇到的Trying to get property of non-object报错以及关联表数据无法展示的问题,核心来自两个问题:

  1. 模型查询返回值类型错误:CodeIgniter的QueryBuilder类中result()方法返回的是查询结果对象数组,哪怕查询条件是主键唯一匹配,返回的也是[0=>对象]格式的数组,不是单个对象。你视图中直接把数组当单个对象访问属性,必然触发报错。
  2. 未做关联表查询:当前模型只查询了inv_inventory单表,没有关联其他外键绑定的表,自然拿不到关联表的明细字段。

排查步骤

  • 第一步先打印控制器中拿到的$asset变量确认结构:在控制器$asset = $this->m_masterinventory->detail_datasset($id);后加var_dump($asset);exit;,就能看到返回的是数组而不是单个对象。
  • 第二步校验数据库查询语句是否正确:打印最后执行的SQL语句,在模型get_where后加echo $this->db->last_query();exit;,拿到SQL放到数据库执行,确认是否有返回结果、是否缺少关联表字段。

解决方法

1. 修复模型查询返回值

如果是按主键查询单条数据,把result()改成row(),直接返回单个对象:

class m_masterinventory extends CI_Model{
public function detail_datasset($id = NULL) {
        // 用row()返回单条查询的对象,空结果返回null
        $query = $this->db->get_where('inv_inventory', array('id' => $id))->row();
        return $query;
}

2. 新增关联表查询逻辑

假设你要关联的组织表是inv_organization(外键organization_id关联该表主键id,要取组织名称org_name字段),品牌表是inv_brand,修改模型方法加入联表逻辑,其他关联表同理添加join语句即可:

public function detail_datasset($id = NULL) {
        // 按需选择要查询的主表+关联表字段,别名避免冲突
        $this->db->select('inv_inventory.*, inv_organization.org_name as organization, inv_brand.brand_name as brand');
        $this->db->from('inv_inventory');
        // 左关联组织表
        $this->db->join('inv_organization', 'inv_organization.id = inv_inventory.organization_id', 'left');
        // 左关联品牌表
        $this->db->join('inv_brand', 'inv_brand.id = inv_inventory.brand_id', 'left');
        $this->db->where('inv_inventory.id', $id);
        return $this->db->get()->row();
}

3. 视图层增加空值判断避免报错

如果查询结果为空或者某个字段为空,提前做判断避免触发报错:

<table class="table table-hover table-bordered table-striped">
  <tr>
    <th>ID</th>
    <td><?= isset($asset->initial) ? $asset->initial : '' ?><?= isset($asset->device) ? date('yd', $asset->device) : '' ?></td>
  </tr>
  <tr>
    <th>Nama</th>
    <td><?= isset($asset->name) ? $asset->name : '-' ?></td>
  </tr>
  <tr>
    <th>Organization</th>
    <!-- 直接取关联查询返回的组织名称字段 -->
    <td><?= isset($asset->organization) ? $asset->organization : '-' ?></td>
  </tr>
  <!-- 其余字段同理增加isset判断即可 -->
</table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:27:02