【问题标题】:How to create a search that uses barcode如何创建使用条形码的搜索
【发布时间】:2019-08-19 10:28:22
【问题描述】:

我正在为使用条形码搜索产品的销售点创建搜索系统。当用户扫描条形码时,带有相应条形码的产品会被添加到购物车中。我使用 Ajax 将条形码传递给控制器​​。问题是,当产品被添加到购物车时,生成的查询会运行两倍的订单数量。我不知道为什么会这样。

查看/搜索栏

<div class="frmSearch">
    <input type="text" id="search" name="search" class="form-control" placeholder="Type Product Name..."
           onmouseover="this.focus();"/>
</div>

<script type="text/javascript">
    $('#search').on('keyup', function () {
        $value = $(this).val();
        $.ajax({
            type: 'get',
            url: '{{URL::to('search')}}',
            data: {'search': $value},
            success: function (data) {
                window.location.href = "/addsale/" + data;
            }
        });
    });
</script>

控制器

public function search(Request $request)
{
    if ($request->ajax()) {
        $raws = DB::table('items_masters')->where('bcode', '=', $request->search)->first();

        if ($raws) {
            $output = $product->id;
        }

        return Response($output);
    }
}

将产品添加到购物车的方法

public function add($id)
{
    $userid = Auth::user()->id;
    $shop = Auth::user()->shop_id;
    $product_id = $id;

    $tdo = item_quantity::getQuery('item_quantities')->where([
        ['shop_id', '=', $shop],
        ['item_id', '=', $product_id]
    ])->get();
    foreach ($tdo as $key => $tad) {
        $product_quantity = $tad->quantity;
    }

    if (empty($product_quantity)) {
        session()->flash('message', 'Item Not In Your Shop');
        return redirect('/sales_area');
    } elseif ($product_quantity <= 0) {
        session()->flash('message', 'Item Out Of Stock');
        return redirect('/sales_area');
    } else {
        $todo = tblcart::getQuery('tblcarts')->where([
            ['product_id', '=', $id], ['shop_id', '=', $shop],
            ['member_id', '=', $uid]
        ])->get();
        foreach ($todo as $key => $tada) {
            $cart_id = $tada->id;
        }
        if (empty($cart_id)) {
            $tem = new tblcart;
            $tem->product_id = $product_id;
            $tem->quantity = 1;
            $tem->shop_id = $shop;
            $tem->member_id = $userid;
            $tem->save();
            return redirect('/sales_area');
        } else {
            $tem = tblcart::find($cid);
            $tem->quantity = $tem->quantity + 1;
            $tem->save();
            return redirect('/sales_area');
        }
    }
}

目前,当用户将产品添加到购物车时,订单数量会增加一倍,因此他得到的不是一个,而是两个。如果用户再次添加相同的产品,他会得到四个而不是两个。我该如何解决这个问题?

【问题讨论】:

    标签: ajax laravel laravel-5.6


    【解决方案1】:

    看起来可能是时间问题,具体取决于如果直接从搜索中调用 add 方法。使用keyup,您可能会至少触发一次搜索功能,甚至可能不止一次触发搜索功能,因为即使在基于之前输入的字符发送了原始 ajax 请求之后,用户仍在输入他们想要的产品搜索栏。

    建议在keyup 函数或搜索代码中添加时间延迟。在控制器中说类似(伪代码)

    if($timeOfLastTransaction < 30 seconds && $productId == $previousProductId)
     // cancel this duplicate
    else
      set $timeOfLastTransaction 
      set $previousProductId
    

    我仍然不确定是什么调用了add() 方法,这将是寻找特定加倍错误的错误的良好开端。

    但是,查看add() 方法中的代码,您可能会稍微清理一些内容——并且可能会解决您的问题。建议直接在方法的参数中命名$id 变量$product_id,而不是在顶部重命名它——你在多个地方对同一事物使用两个不同的变量,这有点令人困惑。

    一个更大的问题是,在从数据库中提取集合后,您可能会在多个位置重新分配相同的变量:

    $tdo = item_quantity::getQuery('item_quantities')->where( [['shop_id', '=', $shop],
    ['item_id', '=', $product_id]])->get();
    foreach ($tdo as $key => $tad) {
        $product_quantity=$tad->quantity;
    }
    

    这一行和它下面的下一个 DB 都循环通过一个集合并重新分配/覆盖 $product_quantity 在这种情况下和 $cart_id 在下一个。为什么不使用-&gt;first() 并跳过循环?我认为这也可以减少任何不可预见的错误

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2016-11-19
      相关资源
      最近更新 更多