减少laravel

时间:2018-01-23 02:12:55

标签: laravel

如何减少laravel中的库存数量?

在我的产品表中,我有库存列,其中我设置了我拥有的项目数量,我想在2个条件下减少它:

1-何时添加到订单表(不是产品在用户购物车中时)

2-订单状态未取消时(如果订单状态被取消,则库存增加回来)

  PS:目前我没有这个问题的代码,这就是我没有分享的原因   任何代码,我正在寻找如何做到这一点的想法。基于我的意愿   制作功能并在此分享以完成它。

订单的JSON

"[{\"id\":29,\"name\":\"effewf\",\"price\":24524,\"quantity\‌​":1,\"attributes\":[‌​{\"attr\":{\"label\"‌​:\"Gray\",\"price\":‌​\"7000.00\"}}],\"con‌​ditions\":[]},{\"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

更新2

我将代码更改为:

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)
                    ]);
               });
          }
      });
  }

现在我的订单将被放置,但库存栏上没有任何变化。

任何想法?

3 个答案:

答案 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