php - 在 Laravel 中排队新的行插入请求以确保服务器端验证并避免重复
问题描述
我有一个表(“产品”),列很少,比如 ID、brand_name、code、country_code 和 countrywise_serial_number、created_at、deleted_at。
我从网页进行 ajax 调用以在表中插入值。我在后端编写的代码是:
public function addProduct(Request $request){
$brand_name = $request->brand_name;
$sNo = DB::table('product')->where('country_code',101)->orderByDesc('countrywise_serial_number')->limit(1)->get();
if($sNo->count()<1){
$sNo=1;
}else{
$sNo= ($sNo[0]->countrywise_serial_number)+1;
}
$getDigit= 1;
for($num=$sNo;$num>10;$num++){
$num= $num/10;
$getDigit++;
}
$zerosrequired= 7- $getDigit;
$zeroes=str_repeat("0",$zerosrequired);
$code="PRO"."IND".date("y")."MD".$zeroes.$sNo; //EG:PROIND20MD0000001
// check if record already exist to avoid duplicate entry
$checkExistence=DB::table('product')->where(function($query) use($code){
$query->where('code', $code);
$query->whereNull('deleted_at');
})
->orWhere(function($query) use($brand_name){
$query->where('brand_name', $brand_name);
$query->whereNull('deleted_at');
})->get();
if($checkExistence->count()>0){
$existingData = array(
'code' => $checkExistence[0]->code,
'name' => $checkExistence[0]->brand_name,
);
return ['message'=> "Duplicate Warning" , 'name'=>$existingData['name'], 'code'=>$existingData['code']];
}
try{
DB::table('product')->insert(
['code' => $code, 'brand_name' => $brand_name,'countrywise_serial_number'=>$sNo]
);
return ['message'=>true];
}
catch(\Exception $e){
return ['message'=>false];
}
}
问题是,如果我多次单击提交按钮,则会调用多个 ajax 请求并插入具有重复值的多行(即具有相同的代码和品牌名称)而没有任何不应该发生的验证。
我担心如果同时从两个或多个设备(具有相同的值)发出请求,是否也会发生这种情况,
为了避免多次单击提交按钮,我尝试使用:
$('#addsubmit').attr("disabled",true); //addsubmit是提交按钮ID
和
$('#addsubmit').off("点击");
但他们都没有工作;下面是ajax调用的js代码:
$("#submit-product").submit(function(event){
//submit-product is form ID
//event.preventDefault();
//event.returnValue = false;
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
event.stopPropagation()
var token = "{{ csrf_token() }}";
var formData={
'brand_name' : $('#brand_name').val(),
'_token': token
};
console.log(formData)
$.ajax({
type : 'post',
data: formData,
datatype: 'json',
url: "{{route('add-products')}}",
success: function(result){
if (result.message=="Duplicate Warning"){
$('#errormessage').html("")
$('#errormessage').css('color', 'red');
console.log("if")
if ($('#med_code').val()== result.code && $('#brand_name').val()==result.name)
$('#errorDetails').html("Brand Name and Code already registered.")
else if($('#med_code').val()== result.code)
$('#errorDetails').html("product Code already in Use.")
else
$('#errorDetails').html("product already registered.")
modalName ="add";
//$('#deleteMessageImg').attr('src','{{asset('admin/images/Error.png')}}')
$('#add-products').modal('hide');
$('#error-modal').modal('show');
}
else if(result.message){
$('#add-products').modal('hide');
$('#add-success-product').modal('show');
$("#submit-product").trigger("reset");
}
}
})
})
如果我一一插入记录,即在完成一个请求后,服务器端验证部分工作正常。
有没有办法让 laravel 一次完成一个请求,然后处理另一个?
解决方案
推荐阅读
- r - 如何从数据框中构造 case_when 的参数?
- php - 无法将日期插入 MySQL TIMESTAMP 类型字段导致错误的时区
- quarkus - 应用 Guava lib 版本与 Quarkus 版本冲突
- java - 无法执行战争 - 文件:“没有主要清单属性”
- c# - 如何在 Xamarin.Android 中实现线程?
- traefik - 防止traefik转发客户端IP
- python - 列表与参考值的偏差
- javascript - Zlib 解压 javascript
- node.js - 包含组件的 EJS 不能传递变量
- java - 使用 spring boot 和 selenium 进行测试不适用于嵌入式服务器