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