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

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

相关产品推荐
方舟 Agent Plan

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

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