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

Laravel如何通过克隆模型数据预填充create页面的表单?

实现Laravel模型克隆按钮的规范方案

你之前调用withInput(compact($newModel))没有生效,是因为compact('newModel')传入的是完整的模型实例,而old()辅助函数只能读取一维的表单字段数组,无法直接从模型实例中取值。

推荐方案(无需修改现有表单,符合Laravel规范)

这个方案完全不需要改动你已经写好的create视图表单代码,利用Laravel自带的闪存输入功能实现自动填充:

修正后的clone方法代码

public function clone(YourModel $existingModel)
{
    $newModel = $existingModel->replicate();
    $newModel->title = "Copy of " . $existingModel->title;
    // 无需手动赋值 created_at:如果模型开启了 timestamps 特性,后续保存新模型时会自动生成该字段值,手动赋值会被覆盖

    // 直接传入模型属性数组到闪存,old() 可直接读取对应字段
    return redirect()->route('models.create')->withInput($newModel->toArray());
}

优势

  • 完全兼容你现有表单的old('字段名')取值逻辑,不需要修改任何表单代码
  • replicate()方法会自动排除主键、UUID、创建/更新时间等系统字段,不会把无效参数传入表单
  • 如果需要过滤要填充的字段,可以调用only/except方法筛选:
    ->withInput($newModel->only(['title', 'content', 'price']))
    

你提到的修改表单的方案可行性说明

该方案是可行的,适合需要同时支持「克隆传值」和「常规新增默认值」两种场景的情况,如果你需要给克隆场景单独设置和常规新增不一样的默认值,可以选择该方案,配合->with('newModel', $newModel)闪存数据即可生效:

// clone 方法中传入模型到闪存
return redirect()->route('models.create')->with('newModel', $newModel);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:48:03