Laravel同一表双关联问题:展示关联用户及解决调用报错
解决你的Eloquent关联问题
嘿,我来帮你搞定这两个关联相关的问题:
问题1:无法获取调度用户的名字
你在Project_Survey模型里定义的scheduledUser()关联是正确的belongsTo关系,但一开始访问{{ $survey->scheduledUser->firstname }}失败,大概率是因为查询时没预加载这个关联。
举个例子,如果你之前查询Project_Survey的时候只写了:
$surveys = Project_Survey::with('user')->get();
那scheduledUser关联并没有被加载,视图里调用自然拿不到数据。
解决方法
查询时同时预加载两个用户关联:
$surveys = Project_Survey::with(['user', 'scheduledUser'])->get();
另外,为了避免调度用户为空时出现报错,建议加上空安全访问(PHP 8+支持):
{{ $survey->scheduledUser?->firstname }}
如果是PHP 7.x版本,可以用optional()辅助函数:
{{ optional($survey->scheduledUser)->firstname }}
问题2:调用survey()->number报属性未定义错误
这个问题很典型——你搞混了关联方法和关联属性的区别:
$survey->survey()返回的是BelongsTo关系的查询构建器实例,不是实际的Survey模型对象,所以直接访问number属性肯定会报错$survey->survey才会返回关联的Survey模型实例(前提是已经预加载了这个关联)
解决方法
把视图里的代码改成访问关联属性:
{{ $survey->survey->number }}
同样,处理Survey可能为空的情况:
{{ $survey->survey?->number }}
另外,你修改后的surveys()关联写法可以优化一下,把多个with()合并成一个数组参数,看起来更简洁:
public function surveys() { return $this->hasMany('App\Project_Survey', 'project_id') ->with(['survey', 'scheduledUser', 'user']); }
关键要点回顾
- 访问关联模型用不带括号的属性,带括号的关联方法是用来构建查询的
- 一定要用
with()预加载需要的关联,既避免N+1查询问题,也能确保视图里能拿到关联数据 - 永远考虑关联可能为null的情况,用空安全运算符或
optional()防止报错
内容的提问来源于stack exchange,提问作者Ruud
相关产品推荐
相关产品推荐

