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

FilamentPHP中如何用登录用户信息自动填充报表表单字段?

FilamentPHP 自动填充登录用户信息到报表表单

我正在用FilamentPHP开发Report资源,需要在创建报表时自动把登录用户的姓名和所属部门填充到表单的两个禁用输入框里,已经配置好了模型关联,但自己写的代码报错了,该怎么解决?

已配置的模型关联

User模型:

public function profile() 
{
  return $this->hasOne(Profile::class); 
}

Department模型:

public function profile(): HasMany
{
    return $this->hasMany(Profile::class);
}

Profile模型:

public function department()
{
  return $this->belongsTo(Department::class);
}
public function user()
{
  return $this->belongsTo(User::class);
}

错误的尝试代码

之前写的自定义函数报错:

Forms\Components\TextInput::make('employee_name')
              ->label('Made by:')
              ->default(function () {
                $data['name'] = \App\Models\Profile::query()->where('user_id', auth()->id());
                return $data;
              })
              ->disabled()
              ->dehydrated(),

问题原因

  1. 仅构建查询未获取结果:Profile::query()->where(...)返回的是查询构建器对象,不是具体的姓名值,需要追加->first()才能拿到Profile模型实例。
  2. 返回值类型错误:TextInput的default()需要返回字符串,而代码里返回了数组$data['name'],导致Filament无法正确渲染输入框内容。

正确实现代码

填充用户姓名

Forms\Components\TextInput::make('employee_name')
    ->label('Made by:')
    ->default(function () {
        // 利用User与Profile的关联直接获取姓名,用optional避免关联为空时报错
        return optional(auth()->user()->profile)->name;
    })
    ->disabled()
    ->dehydrated(),

填充所属部门名称

Forms\Components\TextInput::make('department')
    ->label('Department')
    ->default(function () {
        // 通过链式关联获取部门名称,optional处理空关联情况
        return optional(optional(auth()->user()->profile)->department)->name;
    })
    ->disabled()
    ->dehydrated(),

补充说明

  • optional()函数用于避免用户未关联Profile、或Profile未关联Department时出现致命错误,此时输入框会显示为空。
  • 如果确定每个用户都有对应的Profile和Department,可以去掉optional(),直接写auth()->user()->profile->name和auth()->user()->profile->department->name。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:43:14