Я пытаюсь получить конкретный столбец из второй таблицы с помощью javascript и вернуть его данные в свое представление, но я не уверен, как это можно сделать.
priceproduct_id, min, max и amount.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'));
}
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
Любая идея?
@alariva нет, он использовался в другой моей части приложения, поэтому я просто скопирую его оттуда, может быть, как и ваше предложение, похоже, проблема была в моем столбце базы данных. не могли бы вы увидеть мой вопрос в этом комментарии? stackoverflow.com/questions/51585831/…
разве parseFloat(data)+parseFloat(quantity) не должен быть parseFloat(data)*parseFloat(quantity) ??
Покажите нам, пожалуйста, вашу HTML-структуру.
Почему URL-адрес маршрута - qtydisc/{id}/{qty}, а URL-адрес ajax - admin/qtydisc?
@brlebtag братан, ты видишь +idofproduct+'/'+encodeURI(qtyminmax)? они передают {id} и {qty}, а admin является префиксом моей группы маршрутов, поэтому мой общий URL-адрес - site.co/admin/qtydisc/2/45



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте противоположное условие в бэкэнд-контроллере:
$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, он возвращает {}, похоже, нет точных строк в моей таблице.
Попробуйте проверить необработанный запрос, созданный с помощью ->toSql() вместо ->first(), чтобы узнать, есть ли проблема с SQL или что-то не так с параметром $ qty.
результат: "select amount` из qty_discounts, где product_id =? и min <=? и max> =? "` и "select amount` из qty_discounts, где product_id =? и min <=? и max> =? "`
Попробуйте использовать ->getBindings() вместо ->toSql(), чтобы отображать замененные значения в запросе.
Я получаю этот ["2","8","8"]2 - это мой идентификатор продукта 8 был моим вводом в качестве количества, другой 8, я не знаю, что это
Я подумал, что не уверен, правильно это или нет, как вы видите на моем скриншоте, у меня есть 3 строки с одинаковым product_id, возможно, мы должны сначала создать массив (коллекцию) всех строк с одинаковым product_id, а затем проверить значения min и max, что вы считать?
Лучше делать фильтр внутри запроса, а не в коллекции. Значения в порядке (по одному для каждого условия в ?). Не могли бы вы проверить в базе данных, являются ли min и max целочисленными полями, похоже, есть проблема с диапазонами.
они varchar, а не int
хорошо, кажется, что это работает, когда я изменил их на целые числа, но у меня есть 2 вопроса, 1 должен ли я также преобразовать столбец суммы в целое число? 2 для целого числа, что я должен заполнить как длина / значения?
Если ваши uantities всегда будут целыми числами, измените этот столбец на целое число. Поле длины заполнять не нужно.
@mafortis вы можете использовать int (без длины), если вы планируете хранить целочисленные значения до 2147483648, в противном случае используйте long. Для сумм с десятичными знаками было бы лучше использовать float или double для лучшей десятичной точности. По умолчанию для чисел длина не требуется.
Прекратите смешивать 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);
}
Есть ли какая-то умышленная причина, по которой вы используете массив для
idofproduct(var idofproduct = ["{{$product->id}}"];), когда кажется, что вам нужно скалярное значение? (var idofproduct = "{{$product->id}}";)