首页 > 解决方案 > 在 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 一次完成一个请求,然后处理另一个?

标签: phpmysqldatabaselaravellaravel-5

解决方案


推荐阅读