Laravel中如何将Query Builder计算的total按ID写入inputs表?
解决将计算出的total按ID写入inputs数据库的问题
首先得点明你当前的核心问题:你算出的$total是一个包含多个total值的集合,但既没有关联到inputs表的对应ID,也用错了数据库操作逻辑——你想更新已有记录,却用了插入新记录的insert方法,直接把整个集合塞进去肯定会报错。
下面给你两种可行的解决方案,根据你的实际场景选择即可:
方案一:事后批量更新已有inputs记录
如果你已经创建完inputs记录,现在需要补算并更新total字段,那得先修改查询,让结果带上inputs的ID,这样才能精准对应每条记录:
// 修改查询,同时获取inputs的ID和计算好的total值 $totalRecords = DB::table('prices as a') ->join('inputs as b', 'a.category_id', '=', 'b.category_id') ->select('b.id as input_id', DB::raw('(a.price * b.weight) as total')) ->get(); // 遍历结果,逐个更新对应的inputs记录 foreach ($totalRecords as $record) { DB::table('inputs') ->where('id', $record->input_id) ->update(['total' => $record->total]); } // 如果你用Eloquent模型(假设模型类名为Input),可以简化为: // foreach ($totalRecords as $record) { // \App\Models\Input::where('id', $record->input_id)->update(['total' => $record->total]); // }
方案二:创建inputs记录时直接计算total
看你的store控制器代码,你正在批量创建inputs记录,那其实完全可以在创建环节直接计算total,不用事后补操作,效率更高:
// 先把所有分类对应的价格取出来,存成键为category_id的数组 $categoryPrices = DB::table('prices')->pluck('price', 'category_id')->toArray(); foreach($category as $key => $categoryId) { // 根据当前分类ID获取对应价格,默认0避免分类无价格的报错 $price = $categoryPrices[$categoryId] ?? 0; // 实时计算total $calculatedTotal = $price * $weight[$key]; $$module_name_singular = $module_model::create([ 'category_id' => $categoryId, 'user_id' => $user, 'total' => $calculatedTotal, // 直接传入计算好的数值 'weight' => $weight[$key], 'created_by_name' => auth()->user()->name ]); }
你之前的代码报错原因
- 用
DB::table('inputs')->insert(['total'=>$total])是错误的:insert用于插入新记录,而$total是一个集合而非单个数值,数据库无法识别这种数据格式。 - 最初的查询只返回了total值,没有关联
inputs的ID,导致你无法定位每个total对应的具体记录,自然没法精准更新。
内容的提问来源于stack exchange,提问作者diotridia
相关产品推荐
相关产品推荐

