首页 > 解决方案 > 在 Nova 中处理自动生成的 UUID

问题描述

我有一个带有 UUID 属性的模型,保存在数据库uuid字段中。在 Nova 中,我可以这样声明:

Text::make('UUID');

这不会用默认值(一个新的随机 UUID)填充该字段,所以我添加:

Text::make('UUID')
    ->default(
        function () {
            return Uuid::uuid4();
        }
    )

这填充了该字段,但它是可编辑的,我不想允许,尽管我确实希望在查看详细视图时显示它,所以我添加了这些:

Text::make('UUID')
    ->default(
        function () {
            return Uuid::uuid4();
        }
    )
    ->readonly()
    ->onlyOnDetail()

但是,这是不可用的,因为它会导致uuid从生成的插入查询中省略该字段,并且出现 SQL 错误:

SQLSTATE[HY000]: General error: 1364 Field 'uuid' doesn't have a default value
(SQL: insert into `things` (`name`, `description`, `updated_at`, `created_at`) 
values (Case, ?, 2021-07-23 18:07:28, 2021-07-23 18:07:28))

如果是只读状态导致了这种情况,我尝试使用以下方法隐藏它:

->hideWhenCreating()
->hideWhenUpdating()

但这遇到了同样的 SQL 问题,表明它是可见性的,而不是导致问题的只读状态。

另一种方法是使用Hidden字段类型,文档正是为了这种目的而建议的。这有点工作,允许动态默认值并防止编辑,但它不允许该字段显示在任何视图上。像这样配置,根本就没有出现:

Hidden::make('UUID')
    ->default(
        function () {
            return Uuid::uuid4();
        }
    )
    ->showOnDetail()

showOnDetail不会覆盖字段的隐藏性质。

我应该使用什么属性组合来拥有一个字段:

  1. 使用默认值动态填充
  2. 不可编辑
  3. 隐藏在创作中
  4. 显示在细节上
  5. 包含在数据库查询中?

标签: phplaravel-nova

解决方案


推荐阅读