Laravel如何提交含空值与非空值的表单并将空值存入数据库
问题描述
我有一个带表单的模态弹窗,提交表单时我希望插入用户所有选择或输入的内容。目前我必须填写所有字段并从下拉框选择对应值才能提交表单,需求是无论用户填写了多少内容都可以提交,空值字段直接在数据库中存入空值即可。
现有代码
HTML代码
<div id="feedbackModal" class="modal fade" role="dialog"> <div class="modal-dialog"> <div class="modal-content"> <form method="post" id="feedback_form" autocomplete="off"> <div class="modal-header"> <h4 class="modal-title"></h4> </div> <div class="modal-body"> {{csrf_field()}} <span id="form_output"></span> <div class="form-group"> <label>Adjust Risk Level:</label> <select name="FeedRisklevel" id="FeedRisklevel" class="form-control"> <option value="">Select Risk Level</option> <option value="High Risk">High Risk</option> <option value="Low Risk">Low Risk</option> </select> </div> <div class="form-group"> <label>Influencers:</label><br/> <select name="Feedinfluencers[]" id="Feedinfluencers" multiple class="form-control"> <option value="Long Work Hours">Long Work Hours</option> <option value="No Vacation/Leaves in Recent past">No Vacation/Leaves in Recent past</option> <option value="Salary not per market standards">Salary not per market standards</option> <option value="Lower Salary than Peers">Lower Salary than Peers</option> <option value="No Bonus Received in last one year">No Bonus Received in last one year</option> <option value="No Salary Revision in last one year">No Salary Revision in last one year</option> <option value="Expecting Relocation">Expecting Relocation</option> <option value="Expecting Progression">Expecting Progression</option> <option value="Looking for Role/Job/Unit change">Looking for Role/Job/Unit change</option> <option value="Upskilling/Learning Programs Missing">Upskilling/Learning Programs Missing</option> <option value="High Work Pressure/Stress">High Work Pressure/Stress</option> <option value="Non-Alignment with Supervisors/Managers">Non-Alignment with Supervisors/Managers</option> <option value="Lower Bonus received than expected in last one year">Lower Bonus received than expected in last one year</option> <option value="Lower Salary Revision than expected in last one year">Lower Salary Revision than expected in last one year</option> <option value="No Work Life Balance">No Work Life Balance</option> <option value="Lack of Job Security">Lack of Job Security</option> <option value="Lack of Recognition">Lack of Recognition</option> <option value="Lack of Career Opportunities">Lack of Career Opportunities</option> <option value="Lack of Employee Care Activities">Lack of Employee Care Activities</option> </select> </div> <div class="form-group"> <label>Employee Discussion Feedback:</label> <input type="text" name="feedback" id="feedback" class="form-control" placeholder="Feedback" value="" /> </div> <div class="form-group"> <label>Action Taken:</label> <input type="radio" class="check" name="check" value="Yes">Yes <input type="radio" class="check" name="check" value="No" checked>No <select name="action[]" id="action" multiple class="action form-control"> <option value="Offcycle Salary Revision">Offcycle Salary Revision</option> <option value="Special Bonus">Special Bonus</option> <option value="Retention Bonus">Retention Bonus</option> <option value="Internal Career Opportunity">Internal Career Opportunity</option> <option value="Monthly/Quarterly Recognition">Monthly/Quarterly Recognition</option> <option value="Inline Progression">Inline Progression</option> <option value="Stay Interview">Stay Interview</option> <option value="One on one discussion/Counselling">One on one discussion/Counselling</option> <option value="Personal Development Plan">Personal Development Plan</option> <option value="Relocation Opportunity">Relocation Opportunity</option> <option value="Flexibility in the Schedule">Flexibility in the Schedule</option> <option value="Upskilling/Learning Programs Scheduled">Upskilling/Learning Programs Scheduled</option> <option value="Workload Balanced">Workload Balanced</option> </select> </div> </div> <div class="modal-footer"> <input type="hidden" name="feedback_id" id="feedback_id" value="" /> <input type="hidden" name="FeedRisklevel_id" id="FeedRisklevel_id" value="" /> <input type="hidden" name="Feedinfluencers_id" id="Feedinfluencers_id" value="" /> <input type="hidden" name="Action_id" id="Action_id" value="" /> <input type="hidden" name="button_action" id="button_action" value="insert" /> <input type="submit" name="submit" id="Feedback" value="Submit" class="btn" style="background-color: #CA0088;color: #fff" /> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </form> </div> </div> </div>
前端JS代码
$('#feedback_form').on('submit', function(event){ event.preventDefault(); var form_data = $(this).serialize(); $.ajax({ url:"{{ route('Predictions.store') }}", method:"POST", data:form_data, dataType:"json", success:function(data) { if(data.error.length > 0) { var error_html = ''; for(var count = 0; count < data.error.length; count++) { error_html += "<div class='alert alert-danger'>"+data.error[count]+"</div>"; } $('#form_output').html(error_html); } else { $('#form_output').html(data.success); $('#feedback_form')[0].reset(); $('#feedback').val(''); $('#FeedRisklevel').val(''); $('#Feedinfluencers').val(''); $('#action').val(''); $('.modal-title').text('Submit Feedback'); $('#button_action').val('insert'); $('#members_data').DataTable().ajax.reload(); } } }) });
Laravel控制器代码
public function store(Request $request) { // $validation = Validator::make($request->all(), [ // 'feedback' => 'required', // 'FeedRisklevel' => 'required', // 'Feedinfluencers' => 'required', // 'action' => 'required' // ]); $error_array = array(); $success_output = ''; // if ($validation->fails()) // { // foreach ($validation->messages()->getMessages() as $field_name => $messages) // { // $error_array[] = $messages; // } // } // else // { if($request->get('button_action') == 'insert') { $data = new Prediction([ 'Feedback' => $request->get('feedback'), 'Feedinfluencers' => $request->get('Feedinfluencers'), 'FeedRisklevel' => $request->get('FeedRisklevel'), 'Action' => $request->get('action') ]); $data->save(); $success_output = "<div class='alert alert-success'>Data Inserted</div>"; } if($request->get('button_action') == 'update') { $data = Prediction::find($request->get('feedback_id')); $data->Feedback = $request->get('feedback'); $data->save(); $data1 = Prediction::find($request->get('FeedRisklevel_id')); $data1->FeedRisklevel = $request->get('FeedRisklevel'); $data1->save(); $data2 = Prediction::find($request->get('Feedinfluencers_id')); $data2->Feedinfluencers = $request->get('Feedinfluencers'); $data2->save(); $data3 = Prediction::find($request->get('Action_id')); $data3->Action = $request->get('action'); $data3->save(); $success_output = '<div class="alert alert-success">Thanks for your Feedback!</div>'; } $output = array( 'error' => $error_array, 'success' => $success_output ); echo json_encode($output); }
解决方案
按以下步骤调整即可实现可选填提交:
- 调整数据库表结构
确保predictions表中Feedback、Feedinfluencers、FeedRisklevel、Action四个字段设置为允许为空,若使用Laravel迁移,字段定义加上->nullable()即可,示例:
// 迁移文件字段定义示例 $table->text('Feedback')->nullable(); $table->json('Feedinfluencers')->nullable(); // 多选值推荐用json格式存储 $table->string('FeedRisklevel')->nullable(); $table->json('Action')->nullable();
- 修改控制器取值逻辑
未选择的多选下拉、空输入不会提交参数,需要给字段设置默认值避免报错:
// 新增逻辑调整 if($request->get('button_action') == 'insert') { $data = new Prediction([ 'Feedback' => $request->get('feedback', ''), 'Feedinfluencers' => $request->get('Feedinfluencers', []), // 未选择默认空数组 'FeedRisklevel' => $request->get('FeedRisklevel', ''), 'Action' => $request->get('action', []) // 未选择默认空数组 ]); $data->save(); $success_output = "<div class='alert alert-success'>Data Inserted</div>"; } // 更新逻辑同步调整 if($request->get('button_action') == 'update') { $data = Prediction::find($request->get('feedback_id')); $data->Feedback = $request->get('feedback', ''); $data->save(); $data1 = Prediction::find($request->get('FeedRisklevel_id')); $data1->FeedRisklevel = $request->get('FeedRisklevel', ''); $data1->save(); $data2 = Prediction::find($request->get('Feedinfluencers_id')); $data2->Feedinfluencers = $request->get('Feedinfluencers', []); $data2->save(); $data3 = Prediction::find($request->get('Action_id')); $data3->Action = $request->get('action', []); $data3->save(); $success_output = '<div class="alert alert-success">Thanks for your Feedback!</div>'; }
如果多选字段需要存储为字符串格式,可把空数组用implode转成空字符串:
'Feedinfluencers' => $request->get('Feedinfluencers') ? implode(',', $request->get('Feedinfluencers')) : '', 'Action' => $request->get('action') ? implode(',', $request->get('action')) : '',
- 检查模型配置
确保Prediction模型的$fillable属性包含上述四个字段,允许批量赋值,同时移除模型内对应字段的required验证规则:
// app/Models/Prediction.php protected $fillable = [ 'Feedback', 'Feedinfluencers', 'FeedRisklevel', 'Action' ];
- 调整验证规则(可选)
如果需要保留输入格式校验但不需要必填,可把原来注释的验证规则改为nullable类型:
$validation = Validator::make($request->all(), [ 'feedback' => 'nullable|string|max:500', 'FeedRisklevel' => 'nullable|string|in:High Risk,Low Risk', 'Feedinfluencers' => 'nullable|array', 'Feedinfluencers.*' => 'string', 'action' => 'nullable|array', 'action.*' => 'string' ]);
完成以上调整后,未填写的字段就会自动存入空值,无需用户填写所有字段即可提交。
内容的提问来源于stack exchange,提问作者prashant
相关产品推荐
相关产品推荐

