Как создать поиск с использованием штрих-кода

#ajax #laravel #laravel-5.6

#ajax #laravel #laravel-5.6

Вопрос:

Я создаю поисковую систему для торговой точки, которая использует штрих-коды для поиска товаров. Когда пользователь сканирует штрих-код, товар с соответствующим штрих-кодом добавляется в корзину. Я передаю штрих-код контроллеру с помощью 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');
        }
    }
}
  

В настоящее время, когда пользователь добавляет товар в корзину, количество заказа удваивается, поэтому вместо одного он получает два. Если пользователь снова добавит тот же товар, он получит четыре вместо двух. Как я могу с этим разобраться?

Ответ №1:

Похоже, возможно, проблема со временем, в зависимости от того, вызывается ли метод add непосредственно из поиска. С keyup существует возможный риск запуска функции поиска по крайней мере один раз, а возможно, и более одного раза, в зависимости от того, что пользователь все еще вводит нужный ему товар даже после отправки исходного ajax-запроса на основе предыдущего символа, введенного в строке поиска.

Предлагалось бы добавить временную задержку либо в keyup функцию, либо в ваш код поиска. Скажите что-то вроде (псевдокод) в контроллере

 if($timeOfLastTransaction < 30 seconds amp;amp; $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;
}
  

Эта строка и следующая база данных, расположенная под ней, перебирают коллекцию и повторно назначают / перезаписывают $product_quantity в этом случае и $cart_id в следующем. Почему бы не использовать ->first() и не пропустить цикл? Я думаю, это также может уменьшить количество непредвиденных ошибок