Codeigniter3报Trying to get property of non-object 关联表数据无法全部显示
问题排查与解决方法
根因定位
你遇到的Trying to get property of non-object报错以及关联表数据无法展示的问题,核心来自两个问题:
- 模型查询返回值类型错误:CodeIgniter的QueryBuilder类中
result()方法返回的是查询结果对象数组,哪怕查询条件是主键唯一匹配,返回的也是[0=>对象]格式的数组,不是单个对象。你视图中直接把数组当单个对象访问属性,必然触发报错。 - 未做关联表查询:当前模型只查询了
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
相关产品推荐
相关产品推荐

