You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9中Eloquent Builder实例不存在[company]属性的解决问询

问题描述

我有一个基础的Laravel 9 CRUD应用,数据库中有companies和employees两张表。尝试在employees.show视图中显示单个员工的详情时,其他数据均能正常展示,但打印员工所属公司时,持续出现报错:

Property [company] does not exist on the Eloquent builder instance.

相关代码

Employee模型代码

protected $fillable = [
    'first_name', 'last_name', 'email', 'phone', 'company_id'
];

public function company()
{
    return $this->belongsTo(Company::class);
}

控制器show方法代码

public function show(Employee $employee)
{
    $data = Employee::with('company')->where('id', '=', $employee->id);
    return view('employees.show', compact('employee','data'));
}

show.blade视图代码

<div class="row mb-4">
    <label class="col-sm-2 col-label-form"><b>Company</b></label>
    <div class="col-sm-10">
        {{ $data->company->name }}
    </div>
</div>

说明:employees表中已将company_id设为外键,dd($data)结果显示为Eloquent Builder实例(未执行查询)。

解决方案

问题核心是:控制器里的$data只是未执行的Eloquent查询构造器,并非实际的Employee模型对象,因此无法访问关联的company属性。以下是两种修复方式:

方式一:利用路由模型绑定的实例(推荐)

路由模型绑定已经自动获取了对应Employee实例,只需预加载关联即可:

public function show(Employee $employee)
{
    $employee->load('company'); // 预加载关联,避免N+1查询
    return view('employees.show', compact('employee'));
}

视图中直接使用:

{{ $employee->company->name }}

方式二:修正查询,执行获取操作

若要保留$data变量,需在查询末尾添加first()执行查询并获取模型实例:

public function show(Employee $employee)
{
    $data = Employee::with('company')->where('id', '=', $employee->id)->first();
    return view('employees.show', compact('employee','data'));
}

视图保持{{ $data->company->name }}即可。

额外优化

还可以在路由层面直接指定预加载关联,进一步简化控制器代码:

Route::get('/employees/{employee}', [EmployeeController::class, 'show'])
    ->with('company');

这样控制器无需手动调用load('company'),直接使用$employee->company->name即可。

内容的提问来源于stack exchange,提问作者Arctic Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:05:18