Yii2表单获取用户名替代用户ID报错:Trying to get property of non-object
解决Yii表单中显示用户名报错的问题
首先,你遇到的「Trying to get property of non-object」错误,本质是$model->user返回了null——也就是说你的模型和用户表的关联没正确加载,或者关联关系定义有问题。咱们一步步来解决:
1. 确认模型的关联关系是否正确
你提到模型里有getUserType()方法,但这个应该是获取用户类型的,而非关联用户模型的。你需要确保当前业务模型(比如订单/文章这类模型)里有正确的用户关联方法,命名必须是getUser(),这样才能通过$model->user访问到关联的用户模型:
// 假设你的用户模型是User类,当前模型的外键是user_id public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); }
2. 预加载关联数据,避免延迟加载导致的null
如果控制器查询模型时没有预加载user关联,Yii可能不会自动加载这个关联,导致$model->user为null。在控制器查询模型时加上with('user')做预加载:
// 示例:假设你的业务模型是YourModel $model = YourModel::find()->with('user')->where(['id' => $id])->one();
3. 视图里做容错处理,避免空值报错
即使做了预加载,也可能存在无关联用户的情况(比如新建记录时user_id为空),这时候可以在视图里加个判断,设置默认值:
<?= $form->field($model, 'user_id')->textInput([ // 关联用户存在则显示用户名,否则显示当前登录用户或默认提示 'value' => $model->user ? $model->user->username : Yii::$app->user->identity->username, 'readonly' => true, 'style' => 'width:400px' ]) ?>
如果是新建记录的场景,你也可以直接默认填充当前登录用户的用户名,就像你之前注释的代码逻辑,只是把ID换成用户名即可。
内容的提问来源于stack exchange,提问作者swaggyboi
相关产品推荐
相关产品推荐

