从关联关系中获取用户全名并在视图展示时遇报错问题
解决 "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
相关产品推荐
相关产品推荐

