使用带有 AJAX 的表单更新表格

Updating table using form with AJAX

提问人:Conlaodh Quinn 提问时间:1/24/2022 最后编辑:Conlaodh Quinn 更新时间:1/24/2022 访问量:1320

问:

我是Laravel的新手,我正在尝试使用Ajax调用更新数据表。表中的“rent”字段应该是唯一可以编辑的字段,但到目前为止,我仍无法将更改保留到数据库中。我目前收到的错误指出我的“租金”指数未定义,我不明白这一点,因为租金字段的当前数据显示在表中 - 只有当我尝试更新此字段时,才会出现错误。使用 Ajax 时,“rent”字段似乎无法识别,并且我收到错误消息“undefined index: 'rent''”。当我尝试在没有 Ajax 的情况下更新表时,我收到的错误消息是“SQLSTATE[23000]:完整性约束冲突:1048 列'rent'不能为空”。为了清楚起见,我将包括我的代码片段 - 对此问题的任何帮助,或有关如何更好地实现我的目标的建议将不胜感激!

索引页(数据表的表单)

<div class="flex justify-end content-end items-end mt-4">
  <button type="button" class="shadow md:shadow-lg rounded-full mr-4 font-bold px-10 grantors-btn text-white">
    <img class="inline-block mb-2 mt-2 w-4 h-4 mr-2" src="../../img/Icon-plus-white.png" alt="plus icon">
    <a class="no-underline inline-block text-white " onclick="toggleModal('modal-example-small')">New Apparatus Code</a>
  </button>
</div>
<table id="datatable" class="stripe hover dt-responsive display nowrap" style="width:100%; padding-top: 1em;  padding-bottom: 1em;">
      <thead>
        <tr>
          <th>ID</th>
          <th >Apparatus Code</th>
          <th>Description</th>
          <th>Rent</th>
          <th></th>
        </tr> 
      </thead>
<!--start of for loop-->

@foreach ($apparatusCodes as $apparatusCode)

      <tbody>
<form method="POST" action= "{{ route('apparatus_codes.update' , $apparatusCode->id )}}" class="is-readonly" > 
                @csrf
                @method('PUT')


         <tr id="table{{ $apparatusCode->id}}" data-target=".table{{ $apparatusCode->id}}"> 
          <td class="main-bg"> {{ $apparatusCode->id}} </td>
          <td class="main-bg">{{ $apparatusCode->apparatus_code}} </td>  
          <td class="main-bg"> {{ $apparatusCode->description}}</td>
          <td class="data main-bg" id ="rent" name ="rent" value = "{{ $apparatusCode->rent}}">{{ $apparatusCode->rent}}</td>
                        
          <td class="main-bg"> <img class="mb-1 duration-300  h-6 w-6" 
            src="../img/Icon-arrow-dropdown-white.png" data-toggle="collapse" data-target=".table{{ $apparatusCode->id}}" alt="arrow down"/></a>
          </td>
          <td><button type="button" id="edit-button" class="edit"><img class="mb-1 duration-300 ml-4 inset-0 h-6 w-6" src="../img/edit-icon.svg" alt="edit"></button>
          <button id="save-button" class="save"><img class="mb-1 duration-300 ml-4 inset-0 h-6 w-6" src="/../../img/save-icon.svg" alt="save icon"></button>
      </div>
        <div class="row">
            @if ($errors->any()) <span>{{ $errors }}</span> @endif
        </div>
        </td>

      </form>

索引页(Ajax 调用)

<script>
        $(document).ready(function(){

    $(document).on("click", "#save-button", function() { 
        var url = "{{ route('apparatus_codes.update' , $apparatusCode->id )}}";
        var rent = $("#rent").val();
        console.log(rent);
        $.ajax({
            url: url,
            type: "POST",
            cache: false,
            data:{ 'rent':rent
                

            },
            success: function(dataResult){
                dataResult = JSON.parse(dataResult);
             if(dataResult.statusCode)
             {
                window.location = "{{ route('apparatus_codes.index' , $apparatusCode->id )}}";
             }
             else{
                 alert("Internal Server Error");
             }
                
            }
        });
    }); 
});

    </script>

控制器中的 Upadate 方法

public function update(ApparatusCodesRequest $request, $id)
    {
    
        $validated = $request->validated();
         // find selected apparatus code details
         $apparatusCodes = ApparatusCodes::find($id);
         $apparatusCodes->rent = $request->input('rent');

        
        //$rent = $_POST['rent'];
         if (empty($rent)) {
           echo "Rent is empty";
         } else {
        echo 'rent is'. $_POST['rent'];
         }

路由文件

Route::post('/apparatus_codes/{id}', [App\Http\Controllers\ApparatusCodesController::class, 'update'] )->name('apparatus_codes.update');
PHP ajax laravel 表单 undefined-index

评论

0赞 Dan H 1/24/2022
“rent index is undefined”,如JS错误或PHP错误?
0赞 Conlaodh Quinn 1/24/2022
我相信这是一个PHP错误,当我在控制器中printr()$_POST时,它只是返回'Array()',因此由于某种原因,rent变量没有被拾取
0赞 Nico Haase 1/24/2022
请分享更多细节,例如您面临的错误消息(整个错误信息,而不是任何更短的版本!),以及您解决问题的尝试
0赞 Nico Haase 1/24/2022
另外,请检查这是JS问题还是PHP问题,并从您的问题中删除不相关的部分
0赞 Conlaodh Quinn 1/24/2022
抱歉,就像我说的我是Laravel的新手,所以当我描述我的问题时,请耐心等待我 - 当我使用Ajax时,“rent”字段似乎无法识别,并且我收到错误消息“undefined index: 'rent''。当我尝试在没有 Ajax 的情况下更新表时,我收到的错误消息是“SQLSTATE[23000]:完整性约束违规:1048 列”rent“不能为空”,因此问题一定出在未拾取的 rent 变量上 - 我只是不明白为什么,谢谢

答:

0赞 Dan H 1/24/2022 #1

使用 Laravel 没有必要,事实上,您根本不应该使用 _POST 美元。如果您使用的是框架,请让框架处理和清理您的输入。

public function update(ApparatusCodesRequest $request, $id)
{
     // find selected apparatus code details
     $apparatusCodes = ApparatusCodes::find($id);
     $apparatusCodes->rent = $request->input('rent');
     $apparatusCodes->save();

     // dd($request->input('rent'));
}

此外,该请求甚至在到达控制器之前就已经过验证。所以也没有必要打电话。$validated = $request->validated()

顺便说一句,在访问“rent”的值时,您的JS中存在问题。像这样更改你的 JS:

// Instead of 
var rent = $("#rent").val();

// Change it for
var rent = $("#rent").text();

.val()应仅用于输入字段。或者,您也可以添加一个输入字段来呈现来自后端的值,并保持 JS 不变。这样:

<td class="data main-bg">
    <input id="rent" name="rent" type="text" value="{{ $apparatusCode->rent }}" />
</td>

评论

0赞 Conlaodh Quinn 1/24/2022
感谢您的回答,我最初尝试了您建议的方法,但收到错误消息“SQLSTATE[23000]:完整性约束违规:1048 列'rent'不能为空”。然后我尝试使用 Ajax 来解决这个问题,但我认为主要问题围绕着“租金”变量未被识别 - 您对如何纠正这个问题有什么建议吗?谢谢
0赞 Dan H 1/24/2022
您的问题就在这里: <td class=“data main-bg” id =“rent” name =“rent” value = “{{ $apparatusCode->rent}}”>{{ $apparatusCode->rent}}</td> 你应该把你的 JS 改成使用 var rent = $(“#rent”).text() 而不是 .val()。.val() 只能用于输入字段。
0赞 Conlaodh Quinn 1/24/2022
再次感谢,我实施了您的建议,但是 printr() 仍然返回“Array()”,因此不幸的是,“rent”字段仍然无法识别
0赞 Dan H 1/24/2022
将 JS 保持原样并更新 HTML 可能会更容易,如我编辑的答案所示。