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

从关联关系中获取用户全名并在视图展示时遇报错问题

解决 "Trying to get property of non-object" 报错问题

这个报错的核心原因很明确:$model->taskCreatedBy 返回了 null(没有找到对应的关联用户记录),你直接去访问它的fullname属性自然会触发这个错误。下面给你几个实用的解决方案:

1. 视图层做安全判断(最直接的临时修复)

在视图里访问关联属性前,先判断关联对象是否存在,避免直接访问null的属性:

Created By: <?php echo $model->taskCreatedBy ? $model->taskCreatedBy->fullname : 'Unknown'; ?>

如果你的PHP版本在7.0以上,还可以用更简洁的空安全运算符:

Created By: <?php echo $model->taskCreatedBy?->fullname ?? 'Unknown'; ?>

?? 运算符会在前面的值为null时,返回后面的默认值。

2. 预加载关联数据(优化性能+避免潜在问题)

Yii默认是延迟加载关联数据的,也就是说只有当你第一次访问$model->taskCreatedBy时才会去数据库查询。如果你的模型是在控制器里获取的,建议提前预加载关联,这样既可以避免N+1查询问题,也能确保关联数据被正确加载:

// 在控制器中查询模型时,加上with('taskCreatedBy')
$model = YourTaskModel::find()
    ->with('taskCreatedBy')
    ->where(['id' => $id])
    ->one();

这里的YourTaskModel要替换成你实际的模型类名。

3. 检查数据和关联定义

如果上面的方法还是不行,那就要排查数据层面的问题了:

  • 查看当前模型的taskCreatedBy字段值是否为null,或者是否是一个不存在于User表中的id;
  • 确认关联定义是否正确:你的getTaskCreatedBy()方法里,['id' => 'taskCreatedBy']表示用当前模型的taskCreatedBy字段去匹配User表的id字段,这个映射关系是否和数据库字段一致?

你可以先在视图里临时输出调试信息,看看关联对象的状态:

<?php var_dump($model->taskCreatedBy); ?>

如果输出是null,那就是没有找到对应的用户记录,需要去检查数据库数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:05:36