а следующим этапом перейти на реактивный фреймворк, например vue, когда html рисуется из данных и по событиям меняются данные, а перерисовывается все само.
предлагаю упростить схему:
определять, что это сканер так, как сейчас. убрать выключение всплытия и стандартной обработки события.
в дебоунсовом колбэке (для уменьшения визуального мусора можно воспользоваться "библиотечным дебоунсом", например из lodash, хотя он много где есть, например для jquery есть плагин https://benalman.com/code/projects/jquery-throttle...) анализировать, что это ввод со сканера, вычленять нужные данные, заменять содержимое инпута на него и дальше продолжать обработку как надо.
также не раскрыта тема того, что такое show_stage(1) и почему обработка ввода со сканера должна вести себя не так как ввод пользователя.
условно можно представить то, что я предлагаю так:
можно даже два обработчика события навесить, один с определением ввода со сканера, другой - тот, что debounced (при использовании библиотечного дебоунса позволит сэкономить пару строк и сделает код чище).
Если оно меньше 0,2 секунд, то значит идет ввод со сканера и мы смело блокируем нажатие любых кнопок с клавиатуры
и где про это в вопросе?
вам следует пополнить знания JS)
а вам следует поучиться формулировать вопросы так, чтобы на них можно было ответить. например без указания этого "маленького нюансика" с блокировкой событий (которая должна быть навешена раньше, что тоже несколько усложняет - логика размазывается по разным местам выполнения) ваш код прямо нерабочий. Именно по этому возникает ощущение "запутанности", потому что код очевидно нерабочий, но у вас он работает. Но "нюансик" этот всплывает на втором десятке комментариев к вопросу. Это ненормально. Цените, что до этого дошло и старайтесь в дальнейшем формулировать вопросы так, чтобы эти "нюансики" были в самом вопросе. Из вновь зашедших пользователей не все будут читать комментарии.
Почему он вызывается после каждого отпускания кнопки? что такое searchQr(this.value); в который при таком коде передастся только 1/ (потому что после передачи слеша со сканера возникнет событие и в value будет лежать только 1/)? Если же туда передается весь ШК или его остаток после 1/, то почему?
если ШК содержит переводы строки, то submit будет возникать после каждого перевода строки + в конце (с дефолтными настройками сканера).
Зная формат ШК можно это учесть. Это немного запутает код.
glu-dimaz, так, что код в вопросе уже запутанный. Я бы сделал в виде обработчика submit формы и всё. Тогда по энтеру будет происходить анализ и магия (клавиатурные сканеры по дефолту шлют энтер в конце, а пользователь может его нажать). Как-то так, без всякого jquery, без всякого keyup https://codepen.io/FragsterAt/pen/xbxdNMe
Hfnas, для целей вывода проще всего добавить геттеры в модель.
ну или select('*')->addSelect(DB::raw()) если оно прямо из базы должно бы идти. или view с нужными данными прямо в базу и выбирать из него.
безотносительно того, как перевести в квери билдер ларавеля - зачем в исходном запросе union? почему не case? а то вдруг мускуль тупой и два раза сканит всю таблицу (тут надо explain смотреть)?
Зачем тут джоин сам на себя? добавляются колонки с + и -?