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

求助:使用Ajax与CKEditor5提交数据无法存入Laravel数据库

问题分析与解决方案

1. 阻止表单默认提交行为(页面刷新的核心原因)

你的按钮是type="submit",点击时会触发表单的默认提交动作,直接导致页面刷新,Ajax请求被中断。必须在点击事件里阻止这个默认行为:

修改JS代码:

$(document).ready(function(){
  $("#btn").click(function(event){
    // 阻止表单默认提交动作
    event.preventDefault();
    
    // 正确获取CKEditor5的编辑内容
    const editor = CKEDITOR.instances.editor;
    const content = editor.getData();
    
    $.ajax({
      type: 'post',
      url: "{{ route('sendcom') }}",
      data: { content: content },
      headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
      },
      // 新增回调方便调试
      success: function(res) {
        console.log(res);
        alert('保存成功');
      },
      error: function(xhr) {
        console.error(xhr.responseText);
        alert('保存失败,请查看控制台日志');
      }
    });
  });
});

2. 正确获取CKEditor5内容

CKEditor5会替换原生textarea,直接用$('#editor').val()无法获取编辑器实时内容,必须通过CKEditor实例获取:

  • 确保已正确初始化CKEditor:
ClassicEditor
  .create(document.querySelector('#editor'))
  .then(editor => {
    console.log('编辑器初始化完成');
  })
  .catch(err => {
    console.error(err);
  });
  • 之后用editor.getData()获取内容,如上述JS代码所示。

3. 修正控制器updateOrCreate逻辑

updateOrCreate的正确用法是updateOrCreate(查询条件数组, 要更新/创建的数据数组)。你当前只传了一个数组,相当于用contract = $content作为条件查找用户,找不到就创建仅含contract字段的记录——如果User模型有其他必填字段(如name、email),会直接触发数据库报错。

假设你要更新当前登录用户的contract字段,修改控制器代码:

public function sendcom(Request $request){
    // 可选:验证输入数据
    $request->validate([
        'content' => 'required',
    ]);

    // 获取当前登录用户
    $user = auth()->user();
    
    // 更新用户的contract字段
    $user->update([
        'contract' => $request->content
    ]);

    // 若需按条件创建/更新(比如指定用户标识),可改用:
    // User::updateOrCreate(
    //     ['id' => $user->id], // 查询条件:匹配当前用户ID
    //     ['contract' => $request->content] // 要更新的数据
    // );

    return response(['success' => '合同保存成功。']);
}

4. 调试建议

  • 打开浏览器控制台(F12),切换到Network标签,确认Ajax请求是否发送成功、响应内容是否正常。
  • 查看Laravel日志文件(storage/logs/laravel.log),排查是否有数据库或业务逻辑报错。
  • 可在控制器开头添加dd($request->all());,先确认是否接收到前端发送的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:47:07