我正在为销售点创建搜索系统,该系统使用条形码搜索产品。当用户扫描条形码时,带有相应条形码的产品将被添加到购物车中。我使用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');
}
}
}
当前,当用户将产品添加到购物车时,订单数量增加了一倍,因此他得到的不是原来的一个,而是两个。如果用户再次添加相同的产品,他将得到四个而不是两个。我该如何解决呢?
答案 0 :(得分:0)
看起来像是时序问题,具体取决于 if ,add方法是直接从搜索中调用的。使用keyup
,您可能会冒着至少一次触发一次搜索功能的风险,甚至可能基于用户仍在键入他们想要的产品(即使基于原始字符发送了原始的ajax请求之后)再次触发搜索功能。在搜索栏中输入。
建议在keyup
函数上或您的搜索代码中添加时间延迟。在控制器内说类似(伪代码)的东西
if($timeOfLastTransaction < 30 seconds && $productId == $previousProductId)
// cancel this duplicate
else
set $timeOfLastTransaction
set $previousProductId
我仍然不确定add()
方法的含义,这对于寻找特定的加倍错误是一个不错的开端。
但是,在add()
方法中查看该代码,您可能需要进行一些清理工作,从而解决问题。建议直接在方法的参数中命名$id
变量$product_id
而不是在顶部重命名-您在多个地方对同一事物使用两个不同的var,这有点令人困惑。
更大的问题是,从数据库中提取一个集合后,您可能会在多个位置重新分配同一变量:
$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
。为什么不使用->first()
并跳过循环?我认为这也可以减少任何无法预料的错误