Javascriptによって2番目のテーブルから特定の列を取得し、そのデータをビューに返そうとしていますが、どのように実行できるかわかりません。
price
列がありますproduct_id
、min
、max
、amount
列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'));
}
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
それは私のデータベースがどのように見えるか、そして2
から6
取得します7000
を取得する必要がある間5000
から2
から5
。
番号から7
から9
まったく結果が得られません。
番号から10
取得できるのは7000
何か案が?
主な問題は雄弁な声明にあります。>=
両方の条件で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構造を持っていると思うので、これはこのように機能するはずです。なぜ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);
}
代わりに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
バックエンドコントローラで反対の条件を使用します。
$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)