Filament:删除Repeater项时如何获取subtotal值并更新外部maintotal字段
在Filament中删除Repeater项时更新外部总计字段
要实现删除InvoiceItems Repeater组件中的项时,自动从外部maintotal字段中减去被删除项的subtotal值,你可以通过自定义Repeater的deleteAction来实现,同时可补充状态监听让总计计算逻辑更完整:
完整代码示例
TextInput::make('maintotal') ->disabled() // 建议禁用总计字段,防止手动修改 ->numeric(), Repeater::make('InvoiceItems') ->schema([ TextInput::make('subtotal') ->numeric() ->required(), ]) ->deleteAction(function (Action $action, $record) { // 获取当前总计,默认值设为0 $currentTotal = (float) ($this->form->getState()['maintotal'] ?? 0); // 计算新总计:减去被删除项的subtotal $newTotal = $currentTotal - (float) $record->subtotal; // 更新总计字段,确保数值不小于0 $this->form->fill(['maintotal' => max($newTotal, 0)]); // 执行默认的删除操作 return $action->record($record)->handle(); }) // 可选:监听Repeater状态变化(新增/编辑项时)自动重新计算总计 ->afterStateUpdated(function () { $subtotals = collect($this->form->getState()['InvoiceItems'] ?? []) ->pluck('subtotal') ->map(fn ($val) => (float) $val) ->sum(); $this->form->fill(['maintotal' => $subtotals]); })
关键说明
- 自定义删除动作:通过
deleteAction()传入闭包,可直接获取要删除的$record,从而拿到对应的subtotal值 - 数值类型处理:用
(float)强制转换确保计算时不会出现字符串拼接错误 - 避免负数总计:用
max($newTotal, 0)保证总计不会因删除操作变成负数 - 完整状态监听:
afterStateUpdated能覆盖新增、编辑Repeater项的场景,让总计始终和所有子项的subtotal总和保持一致
内容的提问来源于stack exchange,提问作者user1995781
相关产品推荐
相关产品推荐

