Laravel:从指定列提取数据存入另一表及报错解决
问题修复:Laravel数据插入报错"Attempt to assign property ... on null"
错误根源
- 变量名重复覆盖:初始创建的
purchase_order模型实例被后续查询结果(集合)覆盖,导致最后调用save()时操作的是集合而非模型对象,触发报错。 - foreach语法错误:
foreach($PO as $key->$PO)是错误写法,正确格式应为foreach(集合 as 单条数据)。 - 插入字段不完整:未将表单提交的
po_date、sum等公共字段加入插入数据,不符合业务需求。 - 字段名存在多余空格:插入数组中的
'item_qty '和'dep_name '带有空格,会导致数据库字段匹配失败。
修正后的代码
1. 路由调整
替换原GET路由,改为通过控制器传递数据到视图:
Route::get('addPO', [AdminController::class, 'showPOForm']); Route::post('/addPO', [AdminController::class, 'addDataOrder']);
2. AdminController方法修正
添加表单展示方法,同时修复数据插入逻辑:
// 展示采购订单表单,传递已审批的采购申请数据 public function showPOForm() { $approvedRequests = DB::table('purchase__requests') ->where('status', 'Approved') ->get(); return view('admin.PO', compact('approvedRequests')); } // 处理采购订单数据插入 public function addDataOrder(Request $request) { // 提取表单提交的公共字段 $commonFields = [ 'po_date' => $request->po_date, 'sum' => $request->sum, 'vat' => $request->vat, 'approved_by' => $request->approved_by ]; // 查询所有已审批的采购申请 $approvedRequests = DB::table('purchase__requests') ->select('item_name','description','item_qty','dep_name') ->where('status', 'Approved') ->get(); // 循环插入每条采购订单数据,合并公共字段与申请数据 foreach($approvedRequests as $item){ DB::table('purchase_order')->insert( array_merge($commonFields, [ 'item_name' => $item->item_name, 'description' => $item->description, 'item_qty' => $item->item_qty, 'dep_name' => $item->dep_name, ]) ); } return redirect()->back()->with('success', '采购订单已批量创建'); }
3. PO.blade.php视图修正
修复foreach变量名冲突,修正隐藏input的value错误:
<form action="{{url('/addPO')}}" method="POST"> @csrf <div class="form-group row"> <label class="col-lg-4 col-form-label" for="po_date">Order Date <span class="text-danger">*</span> </label> <div class="col-lg-6"> <input type="date" class="po_date" id="po_date" name="po_date" required="" /> </div> </div> <br /> <div class="table-responsive"> <table class="table text-start align-middle table-bordered table-hover mb-0"> <thead> <tr class="text-dark"> <th scope="col">PR ID</th> <th scope="col">Item Name</th> <th scope="col">Description</th> <th scope="col">Quantity</th> <th scope="col">Department</th> </tr> </thead> @foreach($approvedRequests as $requestItem) <tbody> <tr> <td><input type="text" value="{{$requestItem->PR_id}}" hidden="">{{$requestItem->PR_id}}</td> <td><input type="text" value="{{$requestItem->item_name}}" hidden="">{{$requestItem->item_name}}</td> <td><input type="text" value="{{$requestItem->description}}" hidden="">{{$requestItem->description}}</td> <td><input type="text" value="{{$requestItem->item_qty}}" hidden="">{{$requestItem->item_qty}}</td> <td><input type="text" value="{{$requestItem->dep_name}}" hidden="">{{$requestItem->dep_name}}</td> </tr> </tbody> @endforeach </table> </div> <br /> <br /> <div class="form-group row"> <label class="col-lg-4 col-form-label" for="sum">Sum<span class="text-danger">*</span></label> <div class="col-lg-6"> <input type="number" class="sum" id="sum" name="sum" required="" /> </div> </div> <div class="form-group row"> <label class="col-lg-4 col-form-label" for="vat">Vat<span class="text-danger">*</span></label> <div class="col-lg-6"> <input type="number" class="vat" id="vat" name="vat" required="" /> </div> </div> <div class="form-group row"> <label class="col-lg-4 col-form-label" for="approved_by">Approved By<span class="text-danger">*</span> </label> <div class="col-lg-6"> <input type="text" class="approved_by" id="approved_by" name="approved_by" required="" /> </div> </div> <br /> <br /> <div class="form-group row"> <div class=""> <input type="submit" class="btn btn-success" name="submit" value="Submit" /> </div> </div> </form>
内容的提问来源于stack exchange,提问作者Nardos Mesfin
相关产品推荐
相关产品推荐

