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

如何在Laravel Nova中为只读Text字段填充数据库查询默认值

Laravel Nova只读Text字段预填充数据库值实现方法

核心逻辑说明

Nova字段默认会在编辑、详情页自动读取当前模型的关联属性值回显,嵌套在JSON字段内的属性只要配置好对应模型的类型转换即可自动加载。如果需要在创建页面预填充数据库中已存储的全局配置值,直接在字段定义中调用Eloquent查询,通过default()方法注入预填充值即可。

原有问题代码:

new Panel('Settings', [
    ...JSON::make('Settings', [
        Text::make('Site Locale', 'siteLocale')->readonly(),
    ])->data
]),

具体实现步骤

  • 第一步:给对应模型的JSON字段配置数组类型转换,确保JSON属性读写正常
// 放置在对应Nova资源关联的模型文件中
protected $casts = [
    'settings' => 'array', // 对应代码里的Settings JSON字段
];
  • 第二步:在Text字段定义中通过default()方法传入闭包,闭包内直接写Eloquent查询逻辑拉取需要预填充的值
new Panel('Settings', [
    ...JSON::make('Settings', [
        Text::make('Site Locale', 'siteLocale')
            ->readonly()
            ->default(function () {
                // 替换为实际业务的查询逻辑,示例为查询系统配置表存储的默认站点语言
                return \App\Models\SystemConfig::where('config_key', 'site_locale')->value('config_value') ?? 'zh_CN';
            }),
    ])->data
]),

优化建议

  • 若该配置值属于全局不常变动的数据,建议提前查询后复用,避免闭包内重复执行查询产生额外性能开销,也可以给查询加缓存:
// 在Nova资源的fields方法开头提前查询取值
$siteLocale = cache()->remember('default_site_locale', 86400, function () {
    return \App\Models\SystemConfig::where('config_key', 'site_locale')->value('config_value') ?? 'zh_CN';
});

// 字段定义时直接传入预查询的值
new Panel('Settings', [
    ...JSON::make('Settings', [
        Text::make('Site Locale', 'siteLocale')
            ->readonly()
            ->default($siteLocale),
    ])->data
]),

注意:default()方法仅在创建新数据的页面生效,编辑数据时Nova会自动读取当前记录已存储的siteLocale值覆盖默认值,无需额外判断页面场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:09:20