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

Laravel模型关联获取用户公司数据报错:Attempt to read property "company" on string

问题分析与解决方案

1. 模型关联配置错误(核心问题)

你在User模型中错误使用了hasOne关联,用户属于公司的关系应该用belongsTo——因为外键company_id存放在users表中,指向user_companies表的id字段。另外注意:你的模型名为Company,但对应的数据表是user_companies,需要在Company模型中手动指定表名,否则Laravel会默认查找companies表,直接导致关联查询失败。

修正后的User模型:

// User模型与Company模型的关联
public function company()
{       
    return $this->belongsTo(Company::class, 'company_id');
}

修正后的Company模型:

// 指定模型对应的数据表
protected $table = 'user_companies';

// 公司与用户的一对多关联
public function users()
{
    return $this->hasMany(User::class, 'company_id');
}

2. 控制器代码冗余且逻辑错误

你的profile方法存在两处问题:

  • 参数Company $company无实际作用,还被重新赋值为未执行的查询构造器,造成变量混乱
  • 视图中使用的是$user->company,只需确保$user预加载了关联数据即可,无需额外查询$company变量

修正后的UserController:

public function profile(User $user)
{
    // 预加载company关联,避免N+1查询问题
    $user->load('company');
    
    return view('admin.users.profile', compact('user'));
}

3. Blade视图的容错处理

报错Attempt to read property "company" on string,本质是关联配置错误导致$user->company返回了字符串而非模型实例。修正关联后,建议使用可选链式调用避免用户无关联公司时的报错:

{{ $user->company?->company }}

4. 迁移文件的规范优化

Laravel 8+版本推荐使用更简洁的外键定义语法:

Schema::table('users', function (Blueprint $table) {
    $table->foreignId('company_id')->nullable()->constrained('user_companies')->onDelete('cascade');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:25:26