Filament PHP v3:在禁用的表单字段上,Id 不会写入数据库中

Filament PHP v3: Id does not get written in the database on disabled form-field

提问人:stevan06 提问时间:8/23/2023 最后编辑:stevan06 更新时间:10/17/2023 访问量:937

问:

我目前正在开发一个 Filament PHP 应用程序,我有一个问题:我想显示注释创建者的用户名(在我的情况下),我想在 Filament 中使该字段不可修改。所以我想到了这一点:

        Select::make('user_id')
                            ->options([
                                User::query()
                                    ->select([
                                        DB::raw("name as name"),
                                        'id',
                                    ])
                                    ->where('id', auth()->id())
                                    ->pluck('name', 'id')
                                    ->toArray()
                            ])
                            ->default(
                                auth()->id()
                            )->label(__('messages.created_by'))
                            ->disabled(),

如果我禁用该字段,则不会将任何内容写入数据库。我基本上得到空。

有没有办法禁用字段并确保将user_id写入数据库?

PHP 框架 Laravel-Filament

评论


答:

2赞 AmooAti 8/24/2023 #1

禁用的 HTML 输入将不会提交

Boolean disabled 属性(如果存在)会使元素不可变、不可聚焦,甚至不能随表单一起提交

您可以考虑使用 with ,但它在 select 上不可用,这是合理的,因为如果它是 select,它怎么可能是 readOnly 字段?readOnlydefault

您可能希望使用具有默认值的文本输入,如下所示:

Forms\Components\TextInput::make('user_id')
    ->default(
        auth()->id()
    )
    ->readOnly()
    ->label(__('messages.created_by')),

更新:如果要显示用户名,可以使用以下两个输入:

Forms\Components\Hidden::make('user_id')
    ->default(
        auth()->id()
    ),

Forms\Components\TextInput::make('user_name')
    ->default(
        auth()->user()->name
    )
    ->label(__('messages.created_by'))
    ->disabled(),

显示用户名旁边的隐藏用户 ID

更新2: 您可以在创建页面中使用,并在创建对象之前自定义表单数据。您将需要上一个解决方案中的该用户名字段,对于用户的 ID,请使用以下解决方案。下面是一个示例:mutateFormDataBeforeCreate

...
use Filament\Facades\Filament;


class CreatePost extends CreateRecord
{
    ...
    protected function mutateFormDataBeforeCreate(array $data): array
    {
        $data['user_id'] = Filament::auth()->id();;
        return $data;
    }
}

以这种方式保存敏感数据更安全。

评论

0赞 stevan06 8/24/2023
我使用 select,因为我想显示名称并使用 id 作为写入数据库的值。
1赞 AmooAti 8/24/2023
@stevan06 我已经更新了答案
0赞 stevan06 8/24/2023
谢谢!一个解决方案将起作用。但是,如果您隐藏或禁用 TextInput-> null 就会被写入 te databasel。这很奇怪。
0赞 AmooAti 8/24/2023
@stevan06 也许列 () 可以为 null,因此当它不在请求中时,数据库会将其设置为 NULLuser_id
0赞 stevan06 8/24/2023
是的,当然可以。但是,如果 TextColumn 被禁用或隐藏,则 filaemnt 不会将 TextInput 的值插入到数据库中。不知道为什么
0赞 DariusIII 10/17/2023 #2

与 一起使用,但不能与 一起使用。所以它应该看起来像这样dehydrated()disabled()hidden()->disabled()->dehydrated()