Laravel中Call to undefined relationship [companies]报错如何解决
问题解决方案
报错核心原因是控制器预加载关联时使用的名称和模型实际定义的关联名称不匹配,同时模型存在多余的错误自定义访问器,按以下步骤修改即可:
- 第一步:修改控制器中的预加载关联名称
你在Announcement模型中定义的关联方法名是company,预加载时参数需要和方法名完全一致,将with('companies')改为with('company'),修改后控制器代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\Announcement; use App\Models\Company; class AnnouncementController extends Controller { public function upcomingIssues() { $announcement = Announcement::orderBy('id','desc')->with('company')->get(); return view('pages.upcoming-issues',compact('announcement')); } }
- 第二步:删除
Announcement模型中错误的自定义访问器
额外写的getCompanyAttribute访问器完全多余,且内部调用了不存在的$this->companies关联会引发二次错误,belongsTo关联不需要自定义访问器即可直接通过属性调用,修改后模型代码如下:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Announcement extends Model { protected $table = 'announcements'; public function company() { return $this->belongsTo(Company::class, 'company_id'); } }
- 第三步:调整视图输出避免格式错误
直接输出$announce->company会返回整个Company模型对象引发格式报错,需要指定要显示的公司表字段,例如公司名称字段为name可按以下代码修改,增加空安全操作符?->可避免部分公告无关联公司时触发报错:
<table class="table table-striped"> <thead> <tr> <th scope="col">#</th> <th scope="col">Company</th> </tr> </thead> <tbody> @foreach($announcement as $announce) <tr> <th>{{ $loop->iteration }}</th> <td>{{ $announce->company?->name }}</td> </tr> @endforeach </tbody> </table>
内容的提问来源于stack exchange,提问作者Sulav Lal Khosin
相关产品推荐
相关产品推荐

