Laravel控制器foreach循环中如何逐个获取request的amount值?
Laravel 数组运算错误:Unsupported operand types: array + string
问题代码
控制器中订单存储逻辑如下:
public function store(Request $request) { $values = []; $request->validate([ 'order_number' => 'required', 'client_id' => 'required|exists:clients,id', 'description' => 'required', 'products' => 'required|exists:products,id', 'amount' => 'required', ]); $order = Order::create($request->all()); foreach ($request->products as $product) { $values[] = [ 'order_id' => $order->id, 'product_id' => $product, 'amount' => $request->amount, ]; $amount = Product::find($product); $total_value = $request->amount + $amount->amount; // 错误触发位置 $amount->update(['amount' => $total_value]); } $order->products()->attach($values); return redirect('/')->with('msg', 'Order Saved successfully!'); }
错误原因
报错信息为 Unsupported operand types: array + string,核心问题是:
$request->amount是数组结构(对应每个选中产品的数量),但代码中直接将整个数组与$amount->amount(单个数值)执行加法运算,类型不匹配导致报错。
Product 模型代码
protected $fillable = [ 'name', 'price', 'amount', ]; public function orders() { return $this->belongsToMany(Order::class); }
解决代码及说明
修改后的控制器代码
public function store(Request $request) { $values = []; $request->validate([ 'order_number' => 'required', 'client_id' => 'required|exists:clients,id', 'description' => 'required', 'products' => 'required|array|exists:products,id', 'amount' => 'required|array|same:products', // 验证数组长度与products一致 ]); // 仅传递订单核心字段,避免批量赋值风险 $order = Order::create($request->only('order_number', 'client_id', 'description')); // 带索引循环,匹配产品与对应数量 foreach ($request->products as $index => $productId) { $currentAmount = $request->amount[$index]; $values[] = [ 'order_id' => $order->id, 'product_id' => $productId, 'amount' => $currentAmount, ]; $product = Product::find($productId); $totalValue = $currentAmount + $product->amount; $product->update(['amount' => $totalValue]); } $order->products()->attach($values); return redirect('/')->with('msg', '订单保存成功!'); }
关键修改点
- 验证规则补充
array类型校验,新增same:products确保数量数组与产品数组长度一致,避免数据不匹配 - 使用带索引的
foreach循环,通过$index获取当前产品对应的单个数量值,解决数组与数值运算的类型冲突 - 订单创建时使用
$request->only()指定字段,避免批量赋值的安全问题 - 变量命名优化,避免
$amount这类容易混淆的命名
内容的提问来源于stack exchange,提问作者laraCoder
相关产品推荐
相关产品推荐

