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
相关产品推荐
相关产品推荐

