使用 Laravel 从表单更新数据库记录 - 请求不拉取变量

Updating database records from a form using Laravel - Request not pulling variable

提问人:Conlaodh Quinn 提问时间:1/12/2022 更新时间:1/12/2022 访问量:451

问:

我是Laravel的新手,我正在尝试通过表单更新授予人的详细信息,但是数据库表中的记录没有注册任何更改。问题似乎与请求未拾取存储在变量中的数据有关,因为当代码替换为 时,数据库表确实更新为“updated_data”字符串。为了清楚起见,我将包含现有代码的片段。对此问题的任何帮助将不胜感激!$grantor->grantor_name= $request->input('grantor_name');$grantor->grantor_name= "updated_data";

授予者控制器文件

public function update(Request $request, $id)
    {
        $grantor = Grantor::find($id);
        $grantor->grantor_name= $request->input('grantor_name');
        $grantor->save();

Grantors.edit.blade 文件

<div class="flex-1 px-10">
      <form method="post" action="{{route('grantors.update', $grantor->id )}}" class="is-readonly"> 
     @csrf
      
        <div class="row">
            @if ($errors->any()) <span>{{ $errors }}</span> @endif
         </div>
         <div class="h-auto md:h-96">

            <!-- item -->
            <div x-data=" {isOpen : false} " class="pt-2 pb-4 border-b border-divider">
              <div @click="isOpen = !isOpen"
                class="flex items-center cursor-pointer text-neutral-darker hover:text-primary-hover"
                :class="{'font-bold' : isOpen}">
                <span class="text-xl md:xl">Grantor Details</span>
                <img class="mb-1 duration-300 ml-4 inset-0 h-6 w-6" :class="{'transform rotate-180' : isOpen}"
                    src="../../img/icon-arrow-down.png" alt="Dropdown-arrow">
              </div>
              <div x-show.transition.duration.300ms.origin.bottom="isOpen" x-cloak @click.away="isOpen = false"
                class="pt-3 text-sm text-neutral">
                 @if($is_editable)
                <div class="flex justify-end">
                <button type="button" class="btn btn-default btn-edit js-edit"><img class="mb-1 duration-300 ml-4 inset-0 h-6 w-6" src="../../img/edit-icon.svg" alt="edit icon"></button>
                <button type="button" class="btn btn-default btn-save js-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>
                @endif 
                <form class="w-full">
                  <div class="px-6 sm:px-6">
                   <div class="md:flex items-center">
                    <div class="w-full md:w-1/2 flex flex-col">
                      <div class="md:flex md:items-center">
                        <label for="grantor_name" class="font-bold text-neutral-darker leading-none pr-4" for="inline-full-name" disabled>Grantor/ Company/ Organisation Name *</label>
                        <input class="leading-none text-gray-900 py-2 px-4 w-80 focus:outline-none focus:border-blue-700 mt-4 bg-gray-100 border rounded border-gray-200 is-disabled @error('grantor_name') is-invalid @enderror" name="grantor_name" value="{{ $grantor->grantor_name }}" id="grantor_name" type="text" disabled >
                    </div>
                  </div>
                </div>

租户路由文件

Route::get('/grantors/{id}/edit', [App\Http\Controllers\GrantorController::class, 'edit'])->name('grantors.edit');
Route::post('/grantors/{id}/update', [App\Http\Controllers\GrantorController::class, 'update'])->name('grantors.update');

设保人模型

protected $table = 'grantors';
protected $fillable= [
    'grantor_name'
]);
PHP 拉维尔

评论

0赞 Umer Fayyaz 1/12/2022
dd($request->输入());在控制器中查看您是否收到granter_name
0赞 Conlaodh Quinn 1/12/2022
谢谢,当我尝试这样做时,我收到错误“SQLSTATE[23000]:完整性约束违规:1048 列”grantor_name“不能为空(SQL:更新集 = ?, . = 2022-01-12 10:18:54 其中 = 2)”所以我认为问题是grantor_name的值没有被识别$grantor->grantor_name= $request->input('grantor_name');grantorsgrantor_namegrantorsupdated_atid
0赞 Umer Fayyaz 1/12/2022
你能发送dd($request->input())结果的屏幕截图吗
0赞 Conlaodh Quinn 1/12/2022
不幸的是,我只是 Stack Overflow 的新手,所以我还不能访问聊天,但我上面提到的错误是使用代码时返回的错误。当我用返回值替换它并且数据库记录更改为“updated_data”$grantor->grantor_name= $request->input('grantor_name');$grantor->grantor_name= "updated_data";dd($request->input())[]

答:

1赞 Peppermintology 1/12/2022 #1

您应用了该属性,因此不会作为表单提交的一部分传递。删除,然后提交加号。grantor_nameinputdisableddisabledinputvalue

如果您不希望用户修改该值,请替换为 .disabledreadonly

此外,请确保它具有值。value="{{ $grantor->grantor_name }}"

编辑

我刚刚注意到您在输入之前还有一个额外的嵌套标签。不要嵌套元素,因此请将其删除。formgrantor_nameform

删除嵌套在外部标签内的所有标签。所以基本上任何里面的formform

<form method="post" action="{{route('grantors.update', $grantor->id )}}" class="is-readonly">

我可以在您的示例中看到的是

<form class="w-full">

就在你的下面,在你之前。@endifgrantor_nameinput

然后再次进行一些调试,以检查是否有一对。$request->input()key/valuegrantor_name

评论

0赞 Conlaodh Quinn 1/12/2022
谢谢,我删除了该属性,但错误“SQLSTATE[23000]:完整性约束违规:1048 列”grantor_name“不能为空(SQL:更新授予者设置grantor_name = ?,grantors.updated_at = 2022-01-12 10:18:54 where id = 2)”仍在返回 - 我觉得问题是 $grantor->grantor_name 中的值没有被拉通, 但是,在编辑页面上,这些字段都预填充了数据库表中的当前字段,因此我不知道为什么它没有获取此值disabled
0赞 Peppermintology 1/12/2022
@ConlaodhQuinn我已经对我的答案进行了编辑,因为我注意到在您的代码中有一个我以前没有注意到的额外标签。form
0赞 Conlaodh Quinn 1/12/2022
感谢您到目前为止的帮助,您介意在我的代码中突出显示应该删除的标签吗?form
0赞 Conlaodh Quinn 1/12/2022
再次感谢您的编辑,我已经删除了额外的表单标签,但仍然收到相同的错误 - 是否有可能与无法访问数据有关的原因?据我所知,该表单正在工作并使用字符串更新数据库,而不是使用值$request$grantor->grantor_name$grantor->grantor_name
0赞 Peppermintology 1/12/2022
@ConlaodhQuinn 您需要检查对象中的值。在函数的开头执行 a,并检查是否存在 的元素以及它是否具有预期值。如果您在输出中没有看到,则由于某种原因,您的表单未提交该输出。grantor_name$requestdd($request->input());updategrantor_namegrantor_value