Laravel:下订单后更新股票价值

Posted

技术标签:

【中文标题】Laravel:下订单后更新股票价值【英文标题】:Laravel : Update Stock Value After Order Placement 【发布时间】:2021-07-24 12:36:36 【问题描述】:

我想在下订单时更新库存价值。 挑战是产品在属性表中的属性位置不同。

Small, Medium, Large, Extra large 

我想在下单时分别更新产品属性库存。例如,当用户下订单时,用户选择的产品像

product_id = 1 size Small quantity is 7

所以 7 数量必须从产品属性大小 Small递减

结帐

// checkout
public function checkout(Request $request)

    if ($request->isMethod('post')) 
        $data = $request->all();
        
        DB::beginTransaction(); 

       
        // Get cart details (Items)
        $cartItems = Cart::where('user_id', Auth::user()->id)->get()->toArray();
        foreach ($cartItems as $key => $item) 
            # code...
            $cartItem = new OrdersProduct;
            $cartItem->order_id = $order_id;
            $cartItem->user_id = Auth::user()->id;

            // Get products details
            $getProductDetails = Product::select('product_code', 'product_name', 'product_color')->where('id', $item['product_id'])->first()->toArray();

            $cartItem->product_id = $item['product_id'];
            $cartItem->product_code = $getProductDetails['product_code'];
            $cartItem->product_name = $getProductDetails['product_name'];
            $cartItem->product_color = $getProductDetails['product_color'];
            $cartItem->product_size = $item['size'];
            $getDiscountedAttrPrice = Product::getDiscountedAttrPrice($item['product_id'], $item['size']);

            $cartItem->product_price = $getDiscountedAttrPrice['final_price'];
            $cartItem->product_qty = $item['quantity'];

            $cartItem->save();

            // Want to Update the Product Attribute Table Stock
            $item = new ProductsAttribute;
            $item->where('product_id', '=', $item['product_id'], 'size', '=', $item['size'])->decrement('stock', $request->quantity);
        

        // Insert Order Id in Session variable for Thanks page
        Session::put('order_id', $order_id);

        DB::commit();

       
    


当我运行这段代码时,它会显示一个错误

InvalidArgumentException
Non-numeric value passed to decrement method.

当我像 decrement('stock', 7) 这样直接输入值时,它会显示错误

Illuminate\Database\QueryException
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '`product_id` is null' at line 1 (SQL: update `products_attributes` set `stock` = `stock` - 7, `products_attributes`.`updated_at` = 2021-05-01 17:18:30 where size `product_id` is null)

我搜索了很多,但没有找到任何解决方案。请任何人帮助

【问题讨论】:

【参考方案1】:

只需更改更新查询并使其简单明了。其余代码没问题。

// Want to Update the Product Attribute Table Stock
$product_attribute = ProductsAttribute::where(['product_id' => $item['product_id'], 'size' => $item['size']])->first();
if($product_attribute)
    $stock = $product_attribute->stock - (int) $request->quantity;
    $product_attribute->update(['stock' => $stock]);

【讨论】:

shahidiqbal 它显示错误“Illuminate\Database\Eloquent\MassAssignmentException Add [stock] to fillable property to allow mass assignment on [App\ProductsAttribute]。” ProductsAttribute 模型内添加stock 到可填充属性 如果您仍然遇到问题,请告诉我 异常很明显stock列不在fillable中 先生,请您详细解释一下,我如何将库存添加到 ProductAttribute 模型中的可填充数组中【参考方案2】:

你必须将它扭曲成一个数组或使用两个更好和更容易理解的地方

$item->where([
    ['product_id', '=', $item['product_id']],
    ['size', '=', $item['size']],
])->decrement('stock', (int) $request->quantity);

或者像这样:

$item->where('product_id', $item['product_id'])
     ->where('size', $item['size'])
     ->decrement('stock', (int) $request->quantity);

【讨论】:

它没有降低股票价值。但工作正常。我想减少用户选择的库存价值,比如小号数量 7 的 T 恤,所以在订单完成后,小号 T 恤的库存价值减少 7

以上是关于Laravel:下订单后更新股票价值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel ORM 订单 分表

Laravel ORM 订单 分表

Laravel 更新语法 - 使用数组更新记录

为啥我的 Facades 在更新到 Laravel 7.3 后停止工作?

Laravel 在到达路线时创建数据库条目?

更新 laravel 关系中的许多记录