17370845950

如何在 Laravel 中显示当前登录用户的公司名称而非 ID

本文介绍如何通过定义 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 ?? '未分配公司' }}
  • 使用空合并操作符 ?? 和可选链 ?-> 可防止用户 company_id 为 null 或关联公司被删除时抛出异常;
  • 若需在控制器中使用,同理:
$companyName = Auth::user()?->company?->name ?? 'N/A';

⚠️ 注意事项

  • 确保 Company 模型存在且命名规范(如位于 app/Models/Company.php,类名为 Company);
  • 若频繁展示公司信息,建议在认证后预加载关系以避免 N+1 查询:
// 登录成功后(如 LoginController),可选优化
$user = Auth::user()->load('company');
  • 数据库迁移中已正确建立外键(如你所示),但请确认 company_id 字段允许为 NULL(若用户可暂无公司),否则需在数据库和验证层同步处理。

✅ 总结

只需两步:① 在 User 模型中定义 company() 关系;② 用 Auth::user()->company->name(配合空值安全语法)替代错误的 company_id->name。这是 Laravel 关系映射的标准实践,既语义清晰,又保障健壮性与可维护性。