Laravel双表批量插入报错及仅插入一行问题求助
问题分析与解决方案
错误根源
- 主表字段误用数组命名:视图中
date[]、ab[]、school[]、behora[]是主表Biniyojan的字段(仅需单条记录),加[]导致控制器接收数组,赋值给字符串类型数据库字段时触发Array to string Conversion错误。 - 详情表实例重复复用:循环中未每次创建新的
BiniyojanDetails实例,复用同一实例时Eloquent内部参数处理异常,抛出Illuminate\Database\Grammar::parameterize()类型错误。 - 前端JS包含未解析Blade语法:动态添加表单的JS代码里写了
@foreach,服务器端不会解析前端脚本中的Blade语法,导致新增的下拉框无选项。
修复代码
1. 控制器修改(bbcreate方法)
public function bbcreate(Request $request) { // 创建主表Biniyojan记录 $biniyojan = new Biniyojan(); // 主表字段取单个值(已去掉视图中的[]) $biniyojan->date = $request->date; $biniyojan->ab = $request->ab; $biniyojan->school = $request->school; $biniyojan->behora = $request->behora; $biniyojan->save(); // 批量插入详情表记录 if ($request->has('source') && is_array($request->source)) { foreach ($request->source as $index => $value) { // 每次循环新建详情表实例 $detail = new BiniyojanDetails(); $detail->biniyojan_id = $biniyojan->id; $detail->school = $request->school; // 主表的school值,若详情表需要每行不同则调整 $detail->source = $request->source[$index]; $detail->kriyakalap = $request->kriyakalap[$index]; $detail->cash = $request->cash[$index]; $detail->save(); } } return redirect()->back()->with('status', 'Inserted'); }
2. 视图Blade修改
去掉主表字段的[],并保持表单结构合理性:
<form method="POST" action="{{ route('bbcreate') }}"> @csrf <div class="form-row col-x1-3"> <div class="form-group col-md-2"> <input type="date" placeholder="मिति" value="{{ $today }}" name="date" class="form-control" id="inputCity" required> </div> <div class="form-group col-md-2"> <select id="inputState" placeholder="" name="ab" class="form-control" required> <option>2079-080</option> <option>2078-079</option> </select> </div> <div class="form-group col-md-2"> <select id="inputState" name="school" class="form-control" required> <option selected disabled>स्रोत पाउने संस्था </option> @foreach ($school_array as $sch) <option value="{{ $sch->name }}">{{ $sch->name}}</option> @endforeach </select> </div> </div> <div id="form-field"> <div class="form-row col-x1-3"> <div class="form-group col-md-2"> <select name="source[]" class="form-control" required> <option selected disabled value="">स्रोत</option> <option>केन्द्र</option> <option>प्रदेश</option> <option>स्थानीय</option> <option>अन्य</option> </select> </div> <div class="form-group col-md-2"> <select name="kriyakalap[]" class="form-control" required> <option selected disabled>क्रियाकलाप</option> @foreach ($bini as $bi) <option value="{{$bi->kriyakalap}}"> {{$bi->kriyakalap}}</option> @endforeach </select> </div> <div class="form-group col-md-2"> <select name="debit_credit[]" class="form-control" required> <option selected disabled>डेबिट / क्रेडिट</option> </select> </div> <div class="form-group col-md-2"> <select name="debit_credit_type[]" class="form-control" required> <option selected disabled>डेबिट / क्रेडिट प्रकार</option> </select> </div> <div class="form-group col-md-2"> <input type="text" placeholder="रकम" name="cash[]" class="form-control" required> </div> <div class="form-group col-md-2"> <input type="button" class="btn btn-success" name="add" id="add" value="+"> </div> </div> </div> <div class="form-row col-x1-3" style="justify-content:left ;"> <div class="form-group col-md-2"> <input type="text" placeholder="ब्यहोरा" name="behora" class="form-control" id="behora" required> </div> <div class="form-group col-md-2"> <input type="submit" id="submit" name="submit" value="राख्नुहोस्" class="btn btn-primary "> </div> @if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif </div> <div form-row col-x1-3 id="showdata" class="showdata"> <p class="show_data"></p> <p id="showdata" class="showdata"></p> </div> </form>
3. jQuery代码修改
提前渲染kriyakalap下拉框的选项,避免在JS中使用Blade语法:
<script type="text/javascript"> $(document).ready(function() { // 提前从Blade渲染好选项HTML var kriyakalapOptions = ` <option selected disabled>क्रियाकलाप</option> @foreach ($bini as $bi) <option value="{{$bi->kriyakalap}}"> {{$bi->kriyakalap}}</option> @endforeach `; // 动态添加的表单HTML,使用预渲染的选项 var html = `<span><div class="form-row col-x1-3"> <div class="form-group col-md-2"> <select name="source[]" class="form-control" required> <option selected disabled value="">स्रोत</option> <option>केन्द्र</option> <option>प्रदेश</option> <option>स्थानीय</option> <option>अन्य</option> </select> </div> <div class="form-group col-md-2"> <select name="kriyakalap[]" class="form-control" required> ${kriyakalapOptions} </select> </div> <div class="form-group col-md-2"> <select name="debit_credit[]" class="form-control" required> <option selected disabled>डेबिट / क्रेडिट</option> </select> </div> <div class="form-group col-md-2"> <select name="debit_credit_type[]" class="form-control" required> <option selected disabled>डेबिट / क्रेडिट प्रकार</option> </select> </div> <div class="form-group col-md-2"> <input type="text" placeholder="रकम" name="cash[]" class="form-control" required> </div> <div class="form-group col-md-2"> <input type="button" class="btn btn-danger" name="remove" value="-"> </div> </div></span>`; var max = 5; var x = 1; $("#add").click(function() { if (x <= max) { $("#form-field").append(html); x++; } }) $("#form-field").on('click', '[name="remove"]', function() { $(this).closest('span').remove(); x--; }); }); </script>
内容的提问来源于stack exchange,提问作者Rajan Sharma
相关产品推荐
相关产品推荐

