本文介绍如何通过定义 eloquent 关系,让 `auth::user()` 直接访问关联的公司名称(`company->name`),避免直接使用 `company_id` 字段导致的查询错误。
在 Laravel 中,当用户表(users)通过 company_id 外键关联到公司表(companies)时,不能直接用 Auth::user()->company_id->name——因为 company_id 是一个整型数值(如 5),不是对象,更没有 name 属性,这会导致 PHP 致命错误(Trying to get property 'name' of non-object)。
正确做法是:在 User 模型中定义一个 belongsTo 关系,显式声明“一个用户属于一个公司”,从而启用延迟加载(lazy loading)或预加载(eager loading)能力。
步骤一:定义模型关系在 app/Models/User.php 中添加如下方法:
use App\Models\Company;
public function company()
{
return $this->belongsTo(Company::class);
}? 说明:belongsTo 表示当前模型(User)“属于”另一个模型(Company),Laravel 默认会自动匹配 company_id 字段作为外键,并查找 companies.id,无需额外配置。
在 Blade 模板中(如 resources/views/layouts/app.blade.php),可直接使用:
{{ Auth::user()->company?->name ?? '未分配公司' }}$companyName = Auth::user()?->company?->name ?? 'N/A';
// 登录成功后(如 LoginController),可选优化
$user = Auth::user()->load('company');只需两步:① 在 User 模型中定义 company() 关系;② 用 Auth::user()->company->name(配合空值安全语法)替代错误的 company_id->name。这是 Laravel 关系映射的标准实践,既语义清晰,又保障健壮性与可维护性。