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

FilamentPHP中Repeater组件实现天数自动递增问题求助

解决FilamentPHP Repeater自动递增天数的问题

针对你在Repeater组件中实现新增条目自动设置Day 1、Day 2…的需求,原代码的核心问题在于$get('itineraries')的相对路径错误,且未结合关联模型的创建逻辑处理。以下是两种可行的解决方案:

方案一:关联模型层面自动赋值(推荐)

因为你使用了->relationship(),可以通过mutateRelationshipDataBeforeCreate在创建新关联模型时自动计算天数,同时保证表单加载时显示正确值:

Repeater::make('itineraries')
    ->relationship()
    // 新增条目时自动计算并设置day值
    ->mutateRelationshipDataBeforeCreate(function (array $data, \Illuminate\Database\Eloquent\Model $record): array {
        $dayNumber = $record->itineraries()->count() + 1;
        $data['day'] = "Day {$dayNumber}"; // 若只需数字可直接赋值$dayNumber
        return $data;
    })
    ->schema([
        TextInput::make('day')
            ->default(function ($get, $record) {
                // 编辑已有条目时显示原值,新增时计算现有条目数+1
                if ($record) {
                    return $record->day;
                }
                // 相对路径修正:从子字段回到根级获取itineraries数组
                $existingCount = collect($get('../../itineraries'))->count();
                return "Day " . ($existingCount + 1);
            })
            ->required(),
        // 其余字段保持不变
        TextInput::make('title')
            ->required()
            ->placeholder('ARRIVE KATHMANDU'),
        Textarea::make('description')
            ->required()
            ->placeholder('It is a panoramic thrill flying into Kathmandu on a clear day....'),
        TagsInput::make('available')
            ->separator(',')
            ->placeholder('Check in and Overnight at Hotel'),
        TagsInput::make('unavailable')
            ->separator(',')
            ->placeholder('No meals'),
    ])
    // 可选:开启排序后自动更新所有条目编号
    ->reorderable()
    ->afterReorder(function (\Illuminate\Database\Eloquent\Model $record) {
        $record->itineraries->each(function ($itinerary, $index) {
            $itinerary->update(['day' => "Day " . ($index + 1)]);
        });
    })

方案二:纯前端实时展示(无需存储到数据库)

如果day仅用于前端展示,不需要存入数据库,可以用隐藏字段存索引,再格式化显示:

Repeater::make('itineraries')
    ->relationship()
    ->schema([
        // 隐藏字段存储条目索引
        Hidden::make('entry_index')
            ->default(function ($get) {
                return collect($get('../../itineraries'))->count();
            }),
        // 格式化显示天数,禁止编辑
        TextInput::make('day_display')
            ->default(function ($get) {
                $index = $get('entry_index') ?? collect($get('../../itineraries'))->count();
                return "Day " . ($index + 1);
            })
            ->disabled()
            ->required(),
        // 其余字段保持不变
        TextInput::make('title')
            ->required()
            ->placeholder('ARRIVE KATHMANDU'),
        Textarea::make('description')
            ->required()
            ->placeholder('It is a panoramic thrill flying into Kathmandu on a clear day....'),
        TagsInput::make('available')
            ->separator(',')
            ->placeholder('Check in and Overnight at Hotel'),
        TagsInput::make('unavailable')
            ->separator(',')
            ->placeholder('No meals'),
    ])

核心修正点

  • 原代码中$get('itineraries')路径错误:在Repeater子字段中,需用相对路径../../itineraries才能获取整个Repeater的条目数组。
  • 方案一兼顾了新增和编辑场景,同时支持排序后自动更新编号,保证数据一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:25:01