Laravel 5.6 多对多关联:在视图中访问子字段问题
解决Laravel多对多关联视图无法访问子字段的问题
嘿,我来帮你捋捋这个问题!咱们一步步排查,大概率是某个细节没注意到:
1. 先确认数据真的加载出来了
先在控制器里加个调试,看看关联的项目数据到底有没有拿到:
$user = User::with('projects')->where('id', auth()->user()->id)->first(); dd($user->projects); // 看看输出的集合里有没有项目,每个项目的字段是不是都存在
如果这里输出是空的,那要么这个用户根本没关联项目,要么project_user中间表里没对应的关联记录,先把这个基础问题搞定。
2. 别踩“集合直接访问字段”的坑
很多时候是视图写法错了!$user->projects是个集合(一堆项目),不能直接写{{ $user->projects->name }},得遍历才行:
@foreach($user->projects as $project) <p>项目名:{{ $project->name }}</p> <p>项目描述:{{ $project->description }}</p> @endforeach
要是用户只有一个项目,那也得用first()拿到单个模型再访问字段:
{{ $user->projects->first()->name }}
3. 检查Project模型的可填充字段
如果数据库里明明有这个字段,但视图里就是拿不到,大概率是$fillable没加这个字段!去Project模型里看看:
// App/Project.php protected $fillable = ['name', 'description', '这里加上你需要的字段'];
要是嫌麻烦,开发环境可以直接写protected $guarded = [];(允许所有字段填充,生产环境记得改回精确的fillable哦)。
4. 排查全局作用域的影响
要是你的Project模型加了全局作用域(比如只显示已激活的项目),而用户关联的项目刚好不符合条件,那视图里也看不到数据。可以暂时去掉全局作用域测试:
$user = User::with(['projects' => function($query) { $query->withoutGlobalScopes(); }])->where('id', auth()->user()->id)->first();
5. 最后确认中间表的配置
你的中间表project_user命名符合Laravel的规范(两个模型名按字母顺序排),字段user_id、project_id和时间戳也都加了withTimestamps(),这部分看起来没问题,但可以再检查下数据库里的字段类型是不是和模型主键一致(比如都是unsigned bigint)。
要是以上都排查完还是有问题,把视图里的具体代码和dd出来的数据贴出来,咱们再精准定位!
内容的提问来源于stack exchange,提问作者thurzo101
相关产品推荐
相关产品推荐

