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

如何通过单个Laravel Filament表单创建多条记录?

解决方案

1. 修复创建逻辑,满足返回Model要求

handleRecordCreation 必须返回对应模型实例,你可以在循环创建记录时保存最后一个实例并返回,同时增加非空判断避免无有效记录的情况:

protected function handleRecordCreation(array $data): FeedbackReport
{
    $lastCreatedRecord = null;

    foreach ($data as $fieldName => $value) {
        // 跳过quiz_id,且只处理非空的富文本字段
        if ($fieldName !== 'quiz_id' && !empty($value)) {
            $recordData = [
                'quiz_id' => $data['quiz_id'],
                'field_name' => $fieldName,
                'value' => $value,
            ];
            $lastCreatedRecord = static::getModel()::create($recordData);
        }
    }

    // 确保返回有效实例,避免无记录时出错
    if (!$lastCreatedRecord) {
        throw new \RuntimeException('No valid rich editor content to save');
    }

    return $lastCreatedRecord;
}

2. 处理编辑场景

如果需要支持编辑功能,在 handleRecordUpdate 里先清理当前quiz_id对应的旧记录,再创建新记录,同时同样返回一个实例:

protected function handleRecordUpdate(FeedbackReport $record, array $data): FeedbackReport
{
    // 删除当前quiz_id下的所有旧记录
    static::getModel()::where('quiz_id', $data['quiz_id'])->delete();

    $lastUpdatedRecord = null;
    foreach ($data as $fieldName => $value) {
        if ($fieldName !== 'quiz_id' && !empty($value)) {
            $recordData = [
                'quiz_id' => $data['quiz_id'],
                'field_name' => $fieldName,
                'value' => $value,
            ];
            $lastUpdatedRecord = static::getModel()::create($recordData);
        }
    }

    if (!$lastUpdatedRecord) {
        throw new \RuntimeException('No valid rich editor content to update');
    }

    return $lastUpdatedRecord;
}

3. 编辑时填充表单数据

要让编辑页面正确加载已保存的富文本内容,需要给每个RichEditor字段添加 getStateUsing 方法,从模型中读取对应field_name的值:

return $form
    ->schema([
        Forms\Components\Select::make('quiz_id')
            ->options(Quiz::all()->pluck('name', 'id'))
            ->required(),
        Forms\Components\RichEditor::make('steps')
            ->toolbarButtons([
                'bold',
                'bulletList',
                'italic',
                'link',
                'orderedList',
                'redo',
                'undo',
            ])
            ->getStateUsing(function ($record) {
                // 编辑模式下,读取对应field_name的内容
                if ($record) {
                    return static::getModel()::where('quiz_id', $record->quiz_id)
                        ->where('field_name', 'steps')
                        ->value('value');
                }
                return null;
            }),
        Forms\Components\RichEditor::make('goal')
            ->toolbarButtons([
                'bold',
                'bulletList',
                'italic',
                'link',
                'orderedList',
                'redo',
                'undo',
            ])
            ->getStateUsing(function ($record) {
                if ($record) {
                    return static::getModel()::where('quiz_id', $record->quiz_id)
                        ->where('field_name', 'goal')
                        ->value('value');
                }
                return null;
            }),
    ]);

可选优化

  • 如果不想删除旧记录而是更新,可以在编辑时循环检查每个field_name是否存在对应记录,存在则更新,不存在则创建。
  • 可以给RichEditor字段添加 required 规则,确保至少有一个字段有内容,避免抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:31:22