Laravel 7:传递公司关联项目到视图遇错误求助
解决Laravel中公司与项目关联的两个核心错误
咱们一步步拆解你遇到的问题,逐个解决:
1. 先搞定「Class 'App/Project' not found」错误
这个报错的根源是模型关联的命名空间路径写错了——PHP的命名空间语法用的是反斜杠\,不是你代码里的斜杠/。
修改你的两个模型代码:
Company.php
把关联方法里的路径改成正确的反斜杠格式,更推荐用类名::class的写法(自动解析命名空间,不容易出错):
protected $fillable = [ 'id', 'name', 'description' ]; public function projects() { // 写法1:直接写完整命名空间 return $this->hasMany(\App\Project::class); // 写法2:如果顶部加了use App\Project;,可以简化成 // return $this->hasMany(Project::class); }
Project.php
同样修正关联的命名空间:
protected $fillable = [ 'name', 'description', 'company_id', 'days' ]; public function company() { // 写法1:完整命名空间 return $this->belongsTo(\App\Company::class); // 写法2:顶部加use App\Company;后简化 // return $this->belongsTo(Company::class); }
2. 优化控制器show()方法,修复项目数据错误
你的show()方法里有两个没必要的错误操作:
- 你已经用了路由模型绑定(方法参数
Company $company),Laravel会自动帮你查询对应ID的Company实例,完全不需要再手动执行Company::find($company->id),这行代码是多余的。 - 你硬编码了
Company::find(1)->projects,这会永远只查询ID为1的公司的项目,而不是用户点击的当前公司。
修改后的CompaniesController.php的show()方法:
public function show(Company $company) { // 可选但推荐:预加载项目,避免N+1查询性能问题 $company->load('projects'); // 直接传递$company到视图即可,关联修复后视图能直接调用$company->projects return view('companies.show', compact('company')); }
3. 视图代码可选优化
既然我们已经传递了正确的$company实例,你可以回到最初的视图写法,不需要单独传递$projects变量,更符合Laravel的关联使用习惯:
<div class="jumbotron"> <h1>{{ $company->name }}</h1> <p class="lead">{{ $company->description }}</p> </div> <div class="row"> @foreach($company->projects as $project) <div class="col-lg-4"> <h2>{{ $project->name }}</h2> <p class="text-danger">{{ $project->description }}</p> <p><a class="btn btn-primary" href="/projects/{{ $project->id }}" role="button">View Projects »</a></p> </div> @endforeach </div>
如果你还是习惯单独传递$projects变量,也可以在控制器里这么写:
public function show(Company $company) { $projects = $company->projects; return view('companies.show', compact('company', 'projects')); }
然后保持你修改后的视图写法即可。
最后额外检查
确保你的projects数据库表存在company_id字段,并且该字段的值与companies表的id字段对应(外键约束可选,但数据要匹配)。
内容的提问来源于stack exchange,提问作者Mann Tazho
相关产品推荐
相关产品推荐

