Получить информацию с помощью javascript в laravel

Я пытаюсь получить конкретный столбец из второй таблицы с помощью javascript и вернуть его данные в свое представление, но я не уверен, как это можно сделать.

Логика

  1. В таблице продуктов есть столбец price
  2. В таблице скидок есть столбцы product_id, min, max и amount.
  3. Я ввожу число как количество, если в моей таблице скидок есть идентификатор продукта база на min и max вернуть amount по новой цене

Код

пока это мои коды (я знаю, что в моем методе контроллера есть проблема с идентификацией, чтобы найти правильные данные)

JavaScript

<script>
  $(document).ready(function() {
    // if quantity is not selected (default 1)
    $('#newprice').empty();
    var quantity =  parseInt(document.getElementById("quantity").value);
    var shipingcost = parseFloat(quantity);
    var shipingcostnumber = shipingcost;
    var nf = new Intl.NumberFormat('en-US', {
        maximumFractionDigits:0, 
        minimumFractionDigits:0
    });
    $('#newprice').append('Rp '+nf.format(shipingcostnumber)+'');

    // if quantity is changed
    $('#quantity').on('change', function() {
      var quantity = parseInt(document.getElementById("quantity").value);
      var qtyminmax = $(this).val();
      if (qtyminmax) {
        $.ajax({
          url: '{{ url('admin/qtydisc') }}/'+encodeURI(qtyminmax),
          type: "GET",
          dataType: "json",
          success:function(data) {
            $('#totalPriceInTotal').empty();
            var shipingcost = parseFloat(data)+parseFloat(quantity);
            var shipingcostnumber = shipingcost;
            var nf = new Intl.NumberFormat('en-US', {
                maximumFractionDigits:0, 
                minimumFractionDigits:0
            });
            $('#totalPriceInTotal').append('Rp '+nf.format(shipingcostnumber)+'');
          }
        });
      }else{
        //when quantity backs to default (1)
        $('#newprice').empty();
        var quantity = parseInt(document.getElementById("quantity").value);
        var shipingcost = parseFloat(quantity);
        var shipingcostnumber = shipingcost;
        var nf = new Intl.NumberFormat('en-US', {
            maximumFractionDigits:0, 
            minimumFractionDigits:0
        });
        $('#newprice').append('Rp '+nf.format(shipingcostnumber)+'');
      }
    });
  });
</script>

Route

Route::get('qtydisc/{id}', 'ProductController@qtydisc');

Controller

public function qtydisc($id){
      return response()->json(QtyDiscount::where('min', '>=', $id)->orWhere('max', '<=', $id)->pluck('min'));
    }

Вопрос

  1. Что мне следует изменить в моем методе контроллера, чтобы получить правильные данные?
  2. Что мне следует изменить в моем коде JavaScript? я должен добавить product ID в свой маршрут или ...?

ОБНОВИТЬ

Я пытаюсь внести некоторые изменения в свой код, но не могу получить правильный amount

controller

public function qtydisc($id, $qty){
      $price = DB::table('qty_discounts')
              ->where('product_id', $id)
              ->where([
                  ['min', '>=', $qty],
                  ['max', '<=', $qty],
              ])
              // ->where('min', '>=', $qty)
              // ->where('max', '<=', $qty)
              ->select('amount')
              ->first();
      return response()->json($price);
    }

route

Route::get('qtydisc/{id}/{qty}', 'ProductController@qtydisc');

javascript

//as before...

$('#quantity').on('change', function() {
      var idofproduct = ["{{$product->id}}"]; //added
      var quantity = parseInt(document.getElementById("quantity").value);
      var qtyminmax = $(this).val();
      if (qtyminmax) {
        $.ajax({
          url: '{{ url('admin/qtydisc') }}/'+idofproduct+'/'+encodeURI(qtyminmax), //changed
          type: "GET",
          dataType: "json",
          success:function(data) {
            $('#totalPriceInTotal').empty();
            var shipingcost = parseFloat(data)+parseFloat(quantity);
            var shipingcostnumber = shipingcost;
            var nf = new Intl.NumberFormat('en-US', {
                maximumFractionDigits:0, 
                minimumFractionDigits:0
            });
            $('#totalPriceInTotal').append('Rp '+nf.format(shipingcostnumber)+'');
          }
        });
      }else{
//rest of it as before

Скриншот

Получить информацию с помощью javascript в laravel

вот как выглядит моя база данных, и в качестве результатов по количеству между 2 и 6 я получаю 7000, в то время как мне нужно получить 5000 из 2 в 5.

С номера 7 на 9 я вообще не получаю результатов.

От номера 10 до всего, что я получаю, это 7000

Любая идея?

Есть ли какая-то умышленная причина, по которой вы используете массив для idofproduct (var idofproduct = ["{{$product->id}}"];), когда кажется, что вам нужно скалярное значение? (var idofproduct = "{{$product->id}}";)

alariva 02.08.2018 19:21

@alariva нет, он использовался в другой моей части приложения, поэтому я просто скопирую его оттуда, может быть, как и ваше предложение, похоже, проблема была в моем столбце базы данных. не могли бы вы увидеть мой вопрос в этом комментарии? stackoverflow.com/questions/51585831/…

mafortis 03.08.2018 02:21

разве parseFloat(data)+parseFloat(quantity) не должен быть parseFloat(data)*parseFloat(quantity) ??

Zakaria Acharki 07.08.2018 11:30

Покажите нам, пожалуйста, вашу HTML-структуру.

Zakaria Acharki 07.08.2018 11:36

Почему URL-адрес маршрута - qtydisc/{id}/{qty}, а URL-адрес ajax - admin/qtydisc?

Bruno Lebtag 07.08.2018 19:21

@brlebtag братан, ты видишь +idofproduct+'/'+encodeURI(qtyminmax)? они передают {id} и {qty}, а admin является префиксом моей группы маршрутов, поэтому мой общий URL-адрес - site.co/admin/qtydisc/2/45

mafortis 07.08.2018 19:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
6
7 778
5

Ответы 5

Используйте противоположное условие в бэкэнд-контроллере:

$price = DB::table('qty_discounts')
          ->where('product_id', $id)
          ->where('min', '<=', $qty)
          ->where('max', '>=', $qty)
          ->select('amount')
          ->first(); 

Итак, для $id = 2 и $qty = 5 вы получите

product id = 2  and `min` <= 5 and `max` >= 5

выбор первой строки (row_id = 1)

с этим я получаю количество до qty = 5, но когда я пытаюсь qty 6, он возвращает {}, похоже, нет точных строк в моей таблице.

mafortis 01.08.2018 04:48

Попробуйте проверить необработанный запрос, созданный с помощью ->toSql() вместо ->first(), чтобы узнать, есть ли проблема с SQL или что-то не так с параметром $ qty.

F.Igor 01.08.2018 04:55

результат: "select amount` из qty_discounts, где product_id =? и min <=? и max> =? "` и "select amount` из qty_discounts, где product_id =? и min <=? и max> =? "`

mafortis 01.08.2018 04:59

Попробуйте использовать ->getBindings() вместо ->toSql(), чтобы отображать замененные значения в запросе.

F.Igor 01.08.2018 05:03

Я получаю этот ["2","8","8"]2 - это мой идентификатор продукта 8 был моим вводом в качестве количества, другой 8, я не знаю, что это

mafortis 01.08.2018 05:04

Я подумал, что не уверен, правильно это или нет, как вы видите на моем скриншоте, у меня есть 3 строки с одинаковым product_id, возможно, мы должны сначала создать массив (коллекцию) всех строк с одинаковым product_id, а затем проверить значения min и max, что вы считать?

mafortis 01.08.2018 05:11

Лучше делать фильтр внутри запроса, а не в коллекции. Значения в порядке (по одному для каждого условия в ?). Не могли бы вы проверить в базе данных, являются ли min и max целочисленными полями, похоже, есть проблема с диапазонами.

F.Igor 01.08.2018 05:26

они varchar, а не int

mafortis 01.08.2018 05:29

хорошо, кажется, что это работает, когда я изменил их на целые числа, но у меня есть 2 вопроса, 1 должен ли я также преобразовать столбец суммы в целое число? 2 для целого числа, что я должен заполнить как длина / значения?

mafortis 01.08.2018 05:33

Если ваши uantities всегда будут целыми числами, измените этот столбец на целое число. Поле длины заполнять не нужно.

alariva 03.08.2018 05:31

@mafortis вы можете использовать int (без длины), если вы планируете хранить целочисленные значения до 2147483648, в противном случае используйте long. Для сумм с десятичными знаками было бы лучше использовать float или double для лучшей десятичной точности. По умолчанию для чисел длина не требуется.

F.Igor 05.08.2018 01:30

Прекратите смешивать JavaScript с jQuery вместо

var quantity = parseInt(document.getElementById("quantity").value);

Вы могли бы просто сделать

var quantity = +$('#quantity').val();

И ожидайте, что это будет работать даже в старом Internet Explorer.

Идти дальше

Маршруты

Route::get('/ajax/product/{product}/distcounts', 'AjaxController@productDiscounts);

HTML

<input type = "number" name = "quantity" data-product_id = "{{ $product->getKey() }}">

PHP

public function productDiscounts(Product $product, Request $request) {
    // $product is just a product you are interested in
    // $request->quantity containts passed amount

    $discounts = DiscountModel::product(     // Scope
        $product->getKey()
    )
    ->get()
    ->filter(function($element) use($request) {
        return ($element->min <= $request->quantity && $element->max >= $request->quantity);
    })
    ->values();

    return response->json(discounts);
}

JavaScript

(function($) {
    var getDiscountAmount(e) {
        var $input      = $(e.target);
        var product_id  = $input.data('product_id');

        $.ajax({
            method: 'GET',
            url: '/ajax/product/' + product_id + '/discount',
            data: {
                quantity: $input.val()
            },
            beforeSend: function() {
                $input.prop('disabled', true);
            },
            success: function(discounts) {
                $input.prop('disabled', false);

                // Dunno what you want to do with list of discounts right there
                // It should be an array containing 1 object, but who knows
            }
        })
    }

    $(input[name = "quantity"]).on('change', getDiscountAmount);
})(jQuery);

Надеюсь, это поможет, не тестировал код, поэтому вам может потребоваться добавить некоторые настройки

Если у вас когда-нибудь возникнет ситуация с передачей данных из контроллера в JS, я предлагаю использовать этот пакет JsTransformers. Это заставляет вас делать что-то вроде этого

// in controller
public function index()
{
    JavaScript::put([
        'foo' => 'bar',
        'user' => User::first(),
        'age' => 29
    ]);

    return view('index');
}

// in view scripts
console.info(foo); // bar
console.info(user); // User Obj
console.info(age); // 29

Основная проблема связана с вашим красноречивым заявлением, вы должны использовать >= в обоих условиях с оператором OR с помощью помощника orWhere, поэтому это должно быть примерно так:

$price = QtyDiscounts::where('product_id', $id)
    ->where('min', '>=', $qty)
    ->orWhere('max', '>=', $qty)
    ->pluck('amount')
    ->first();

Но вам действительно нужно взглянуть на свою структуру JS, я предлагаю разделить ваш код для работы по концепции DRY, сначала прослушиватель событий, например:

$('body').off('input', '#quantity').on('input', '#quantity', function () {
    var qty = parseInt( $(this).val() );

    if (qty) {
        getAmount(qty);
    }else{
        getAmount(1);
    }
});

Затем вызываемые вспомогательные функции:

function setValue(quantity, amount)
{
    var newPrice = $('#newprice');
    var totalPrice = $('#totalPriceInTotal');

    newPrice.empty();
    totalPrice.empty();

    var nf = new Intl.NumberFormat('en-US', {
        maximumFractionDigits:0,
        minimumFractionDigits:0
    });

    newPrice.val('Rp '+nf.format(amount)+'');
    totalPrice.val('Rp '+nf.format(parseFloat(amount)*parseFloat(quantity))+'');
};

function getAmount(quantity)
{
    var url = $('#qty_url').val();
    var productId = $('#product_id').val();

    $.ajax({
        url: url+'/'+productId+'/'+encodeURI(quantity),
        type: "GET",
        dataType: "json",
        success:function(amount) {
            setValue(quantity, amount);
        }
    });
};

Я предполагаю, что у вас простая структура HTML, поэтому она должна работать таким образом, почему я предлагаю здесь, если никогда не использовать переменную php, такую ​​как url и product_id, непосредственно внутри вашего JS-кода, вместо этого прикрепите значения, которые вы хотите, к скрытым входам и получите значение эти входные данные с использованием JS:

<input type = "hidden" id = "qty_url" value = "{{ url('admin/qtydisc') }}" />
<input type = "hidden" id = "product_id" value = "{{ $product->id }}"/>

Вы должны написать свой запрос так:

public function qtydisc($id, $qty){
      $price = DB::table('qty_discounts')
              ->where('product_id', $id)
              ->where($qty, '>=', 'min')
              ->where($qty, '<=', 'max')
              ->select('amount')
              ->first();
      return response()->json($price);
    }

Другие вопросы по теме