如何减少laravel中的库存数量?
在我的产品表中,我有库存列,其中我设置了我拥有的项目数量,我想在2个条件下减少它:
1-何时添加到订单表(不是产品在用户购物车中时)
2-订单状态未取消时(如果订单状态被取消,则库存增加回来)
PS:目前我没有这个问题的代码,这就是我没有分享的原因 任何代码,我正在寻找如何做到这一点的想法。基于我的意愿 制作功能并在此分享以完成它。
订单的JSON
"[{\"id\":29,\"name\":\"effewf\",\"price\":24524,\"quantity\":1,\"attributes\":[{\"attr\":{\"label\":\"Gray\",\"price\":\"7000.00\"}}],\"conditions\":[]},{\"id\":27,\"name\":\"new product\",\"price\":7246,\"quantity\":2,\"attributes\":[],\"conditions\":[]}]"
基于@btl回答我在order
模型中添加了以下代码:
protected static function boot()
{
parent::boot();
$productIdsAndQuantities = $this->products->map(function ($product) {
return [$product->id => $product->quantity];
});
static::updating(function (Order $order) {
// restock if cancelled
$oldStatus = OrderStatus::find($order->getOriginal('orderstatus_id'));
if ($oldStatus->title !== 'Cancelled' && $order->orderstatus->title === 'Cancelled') {
$order->products->each(function(Product $product) {
$stock = $product->getAttribute('stock');
$product->update([
'stock' => $stock + $product->order->getAttribute($productIdsAndQuantities)
]);
});
}
});
}
我认为此代码需要在$productIdsAndQuantities
和$product->update(['stock' => $stock + $product->order->getAttribute($productIdsAndQuantities)]);
部分修复才能使用它。
当我尝试将购物车详情添加到订单表
时,我现在收到以下错误消息不在对象上下文中时使用$ this
我将代码更改为:
protected static function boot()
{
parent::boot();
static::updating(function (Order $order) {
$productIdsAndQuantities = $order->product_name->map(function ($product) {
return [$product->id => $product->quantity];
});
// restock if cancelled
$oldStatus = OrderStatus::find($order->getOriginal('orderstatus_id'));
if ($oldStatus->title !== 'Cancelled' && $order->orderstatus->title === 'Cancelled') {
$order->products->each(function(Product $product) {
$stock = $product->getAttribute('stock');
$product->update([
'stock' => $stock + $product->order->getAttribute($productIdsAndQuantities)
]);
});
}
});
}
现在我的订单将被放置,但库存栏上没有任何变化。
任何想法?
答案 0 :(得分:0)
你的桌子看起来像,
<强>产品强>
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
......
$table->integer('stock');
$table->timestamps();
});
<强>库存强>
Schema::create('stocks', function (Blueprint $table) {
$table->increments('id');
$table->integer('product_id')->unsigned();
$table->integer('order_id')->unsigned();
$table->enum('fall_rise',[-1,1]);
$table->timestamps();
$table->foreign('product_id')->references('id')->on('products');
$table->foreign('order_id')->references('id')->on('orders');
});
订单强>
Schema::create('orders', function (Blueprint $table) {
$table->increments('id');
.....
.....
$table->timestamps();
});
现在,添加库存值为10的样本产品,如
$product = new Product();
$product->name = "abc";
......
$product->stock = 10;
$product->save();
现在,在订购abc时,在订单表中添加详细信息。现在,库存值减少然后更新产品中库存列的值10-1 = 9,在库存表中添加记录如
示例值,
product_id = 1;
order_id = 1;
....
fall_rise = -1;
这样,当订购10个产品库存时,库存栏变为零,因此产品变得不可用。如果您只想获取可用的产品,请使用像
这样的查询$available_products = Product::where('stock', '>', 0)->get();
我希望你能理解。
答案 1 :(得分:0)
注册模型事件以处理订单更新。
在订单模型中:
protected static function boot()
{
parent::boot();
static::updating(function (Order $order) {
// restock if cancelled
$oldStatus = OrderStatus::find($order->getOriginal('orderstatus_id');
if ($oldStatus->name !== 'cancelled' && $order->orderstatus->name === 'cancelled') {
$order->products->each(function(Product $product) {
$stock = $product->getAttribute('stock');
$product->update(['stock' => $stock + $product->order->getAttribute('quantity_of_product_ordered')]);
});
}
// added to order table similar to above...
// check if it's a new product id being added to the order, decrease stock quantity accordingly...
// ...
});
}
答案 2 :(得分:0)
当我想在try {
表格中保存我的数据时,诀窍就是在我的CartController
上使用orders
我应该放置我的代码:
try {
$order = new Order();
$qty = Cart::getTotalQuantity();
$order->product_data = $cartItems;
$order->user_id = Auth::user()->id;
// rest of it...
Auth::user()->orders()->save($order);
//trick is in this part
foreach ($cartItems as $item) {
$product = Product::find($item->id);
$product->decrement('stock', $item->quantity);
}
答案是here