用ajax-laravel更新数据库字段

dxxyhpgq  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(540)

当用户使用post方法完成订单时,我试图通过从数据库中的产品数量中减去购物车项目数量来更新我的库存水平。每次运行该方法时,success函数都会出现,但字段不会更新。
有人能告诉我为什么吗?
我的控制器:

public function index ()
{
    $products = Product::all();

    return view('products', compact('products'));
}

public function cart()

{
    return view('cart');
}

public function addToCart($id)
{
    $product = Product::find($id);

    if(!$product) {

        abort(404);

    }

    $cart = session()->get('cart');

    // if cart is empty then this will be the first product
    if(!$cart) {

        $cart = [
                $id => [
                    "name" => $product->name,
                    "quantity" => 1,
                    "price" => $product->unit_price
                ]
        ];

        session()->put('cart', $cart);

        return redirect()->back()->with('success', 'Product added to cart successfully!');
    }

    // if cart isnt empty then check if this product exist then increment quantity
    if(isset($cart[$id])) {

        $cart[$id]['quantity']++;

        session()->put('cart', $cart);

        return redirect()->back()->with('success', 'Product added to cart successfully!');

    }

    // if item doesnt exist in cart then add to cart with quantity = 1
    $cart[$id] = [
        "name" => $product->name,
        "quantity" => 1,
        "price" => $product->unit_price
    ];

    session()->put('cart', $cart);

    return redirect()->back()->with('success', 'Product added to cart successfully!');
}

public function update(Request $request)
{
    if($request->id and $request->quantity)
    {
        $cart = session()->get('cart');

        $cart[$request->id]["quantity"] = $request->quantity;

        session()->put('cart', $cart);

        session()->flash('success', 'Cart updated successfully');
    }
}

public function remove(Request $request)
{
    if($request->id) {

        $cart = session()->get('cart');

        if(isset($cart[$request->id])) {

            unset($cart[$request->id]);

            session()->put('cart', $cart);
        }

        session()->flash('success', 'Product removed successfully');
    }
}

public function stock (Request $request)
{
    if($request->id and $request->quantity)
    {
        $cart = session()->get('cart');

        $cart[$request->id]['quantity'] = $request->quantity;

        $products = Product::all();

        $stock = $products->unit_stock;

        $quantity = $stock - $cart;

        return $quantity;
    }
}

我的路线:

Route::post('stock', 'ProductController@stock');

我的视图cart.blade.php:

@extends('layout')

@section('content')

<table id="cart" class="table table-hover table-condensed">
    <thead>
    <tr>
        <th style="width:50%">Product</th>
        <th style="width:10%">Price</th>
        <th style="width:8%">Quantity</th>
        <th style="width:22%" class="text-center">Subtotal</th>
        <th style="width:10%"></th>
    </tr>
    </thead>
    <tbody>

    <?php $total = 0 ?>

    @if(session('cart'))
        @foreach(session('cart') as $id => $details)

            <?php $total += $details['price'] * $details['quantity'] ?>

            <tr>
                <td data-th="Product">
                    <div class="row">

                        <div class="col-sm-9">
                            <h4 class="nomargin">{{ $details['name'] }}</h4>
                        </div>
                    </div>
                </td>
                <td data-th="Price">${{ $details['price'] }}</td>
                <td data-th="Quantity">
                    <input type="number" value="{{ $details['quantity'] }}" class="form-control quantity" />
                </td>
                <td data-th="Subtotal" class="text-center">${{ $details['price'] * $details['quantity'] }}</td>
                <td class="actions" data-th="">
                    <button class="btn btn-info btn-sm update-cart" data-id="{{ $id }}"><i class="fa fa-refresh"></i></button>
                    <button class="btn btn-danger btn-sm remove-from-cart" data-id="{{ $id }}"><i class="fa fa-trash-o"></i></button>
                </td>
            </tr>
        @endforeach
    @endif

    </tbody>
    <tfoot>
    <tr class="visible-xs">
        <td class="text-center"><strong>Total {{ $total }}</strong></td>
    </tr>
    <tr>
        <td><a href="{{ url('/products') }}" class="btn btn-warning"><i class="fa fa-angle-left"></i> Continue Shopping</a></td>
        <td colspan="2" class="hidden-xs"></td>
        <td class="hidden-xs text-center"><strong>Total ${{ $total }}</strong></td>
    </tr>
    </tfoot>

    <div class="row">
       <div class="btn col-md-12">
           <a href="{{ url('/cart') }}" id="order-complete">Test</a>
       </div>

    </div>
</table>

<script type="text/javascript">

    $("#order-complete").click(function (e){
       e.preventDefault();

        var ele = $(this);

        $.ajax({
           url: '{{ url('stock') }}',
           method: "post",
           data: {_token: '{{ csrf_token() }}'},
           success: function () {

            window.location.reload();
           }
        });
    });
</script>

@endsection
k10s72fa

k10s72fa1#

我可以看到一些潜在的问题,可能导致这一点。首先,看起来您试图通过加载包含所有产品的集合,而不是循环/加载订单($request)中包含的产品,一次性地针对数据库中的所有产品设置库存。你在这里这样做;

$products = Product::all();

然后您尝试在这里更改集合中所有产品的库存;

$stock = $products->unit_stock;

$quantity = $stock - $cart;

我想你家里应该有一批产品 $cart 应该循环并加载以操纵的变量。一些伪代码来说明我的观点;

foreach($product in $cart){
  $loadedProduct        = Product::find($product);
  $loadedProduct->stock = $loadedProduct->stock - $product["quantity"];
  $loadedProduct->save(); 
}

您也没有在提供的代码中保存任何产品。上面的伪代码中有一个这样的例子。

56lgkhnf

56lgkhnf2#

我能从你的代码中发现一些错误。
让我们关注ajax请求调用的函数。
这行告诉我有一个数据 id 以及 quantity 正在发送。

if($request->id and $request->quantity)

从你的路线看,它在身体里。但是在ajax函数中,除了csrf令牌之外,没有包含任何数据。尝试添加 id 以及 quantity 数据。这只是价值的假设。

data: {_token: '{{ csrf_token() }}', id: 6, quantity: 2},

其次,这个函数返回一个产品集合。

$products = Product::all();

所以,如果你想修改一个产品,你必须访问它的索引。例如

$products[0]->unit_stock = 3; 
$products[0]->save();

或者lewis所说的,您可以使用foreach循环来迭代集合中的每个对象

相关问题