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
相关产品推荐
相关产品推荐

