web-dev-qa-db-ja.com

laravel

Javascriptによって2番目のテーブルから特定の列を取得し、そのデータをビューに返そうとしていますが、どのように実行できるかわかりません。

論理

  1. 製品テーブルにはprice列があります
  2. 割引テーブルにはproduct_idminmaxamount
  3. minに基づいて割引テーブルに製品IDがあり、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

スクリーンショット

screenshotdb

それは私のデータベースがどのように見えるか、そして2から6取得します7000を取得する必要がある間5000から2から5

番号から7から9まったく結果が得られません。

番号から10取得できるのは7000

何か案が?

9
mafortis

主な問題は雄弁な声明にあります。>=両方の条件で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構造を持っていると思うので、これはこのように機能するはずです。なぜurlproduct_id JSコード内に直接入力する代わりに、非表示の入力に必要な値をアタッチし、JSを使用してこれらの入力の値を取得します。

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

クエリは次のように書く必要があります。

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);
    }
0
Bruno Lebtag

代わりに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.log(foo); // bar
console.log(user); // User Obj
console.log(age); // 29
0
Yamen Ashraf

バックエンドコントローラで反対の条件を使用します。

$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)

0
F.Igor