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
相关产品推荐
相关产品推荐

