如何在Filament PHP的客户创建页面批量添加多个客户
如何在Filament的CustomerResource中批量创建多个客户?
你当前提供的表单只能创建单个客户,无法一次性提交多条客户数据。要实现点击一次创建按钮保存多位客户的需求,需要修改表单结构并调整数据处理逻辑,具体步骤如下:
1. 用Repeater组件重构表单
Filament的Repeater组件允许用户动态添加多个相同的字段组,正好适合批量输入客户信息。将原本的单条字段包裹到Repeater中:
public static function form(Form $form): Form { return $form ->schema([ Forms\Components\Repeater::make('customers') ->schema([ Forms\Components\TextInput::make('name') ->required() ->maxLength(255), Forms\Components\TextInput::make('phone') ->tel() ->required(), ]) ->minItems(3) // 强制最少输入3条客户信息,可选配置 ->maxItems(10) // 限制最多输入10条,可选配置 ->columns(2), // 字段两列布局,优化页面展示 ]); }
2. 重写数据处理逻辑实现批量保存
默认的Filament创建动作只会处理单条数据,因此需要在CustomerResource中重写表单数据的处理逻辑,遍历提交的客户数组批量创建记录:
public static function create(CreateRecord $record): CreateRecord { return $record->mutateFormDataUsing(function (array $data): array { // 先验证手机号的唯一性(包括提交的条目内和数据库中) $phoneList = collect($data['customers'])->pluck('phone'); if ($phoneList->duplicates()->isNotEmpty()) { throw new ValidationException([ 'customers.*.phone' => '提交的手机号不能重复' ]); } $existingPhones = Customer::whereIn('phone', $phoneList)->pluck('phone'); if ($existingPhones->isNotEmpty()) { throw new ValidationException([ 'customers.*.phone' => "手机号 {$existingPhones->join(', ')} 已存在" ]); } // 批量创建客户 Customer::insert($data['customers']); return []; }); }
这里用insert方法批量插入数据比循环create更高效,同时提前做了手机号的重复验证,避免创建时出现数据库唯一约束错误。
补充说明
- 如果需要更细致的每条数据验证,可以在Repeater的
validateUsing方法中添加自定义规则,针对每条客户信息单独校验。 - 根据业务需求,你可以调整Repeater的
minItems、maxItems等参数,或者允许用户动态添加/删除条目。
内容的提问来源于stack exchange,提问作者Alphy Gacheru
相关产品推荐
相关产品推荐

