【问题标题】:Update Laravel Form with Ajax使用 Ajax 更新 Laravel 表单
【发布时间】:2020-01-29 01:32:54
【问题描述】:

我正在尝试使用 ajax 更新数据以防止页面重新加载。这已经从配置文件模型中填充了。尽管这很简单,但我无法通过 ajax 提交此请求。

这段代码给了我以下错误:

从空值创建默认对象

谁能帮我理解我在这里做错了什么?

刀片文件

<form class="form-horizontal" id="editProfile" data-parsley-validate>
  @method('PUT')
  @csrf

  <div class="row">
      <div class="col-md" style="padding:0px;">
          <input type="hidden" name="usr_id" id="usr_id">
          <input type="hidden" name="user_id" id="user_id" value="{{ $profile->user_id }}">
          <input type="hidden" name="username" id="username" value="{{ $profile->username }}">
          <input type="hidden" name="emp_id" id="emp_id" value="{{ $profile->emp_id }}">
          <input type="hidden" name="site" id="site" value="{{ $profile->site }}">

      <div class="form-group">
          <label for="firstname" class="col-sm-4 control-label">First Name</label>
          <div class="col-sm-10">
              <input type="text" class="form-control" id="first_name" value="{{$profile->first_name}}" placeholder="First Name">
          </div>
      </div>

      <div class="form-group">
          <label for="lastname" class="col-sm-4 control-label">Last Name</label>
          <div class="col-sm-10">
              <input type="text" class="form-control" id="last_name" value="{{$profile->last_name}}" placeholder="Last Name">
          </div>
      </div>

 <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" id="submit" value="submit" class="btn btn-danger">Update</button>
</div>
</div>
    </div>
   </div>
</form>

控制器

public function update(Request $request, $usr_id)
{
   $profile = Profile::find($usr_id);

   $profile->first_name = $request->input('first_name');
   $profile->last_name = $request->input('last_name');
   $profile->update();
}

Ajax 脚本:

<script>
    $(document).ready(function() {
    // Update Data

        $.ajaxSetup({
            headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        $('#editProfile').on('submit', function(e){
            e.preventDefault();

            var usr_id = $('#emp_id').val();

            $.ajax({
                type: "PUT",
                url: "/profile/edit/" + usr_id,
                dataType: $('#editProfile').serialize(),
                success: function (response) {
                    console.log(response);
                    alert("Data Updated");
                    location.reload();
                },
                error:function(error){
                    console.log(error);
                }
            });
        });

    });

</script>

路线

Route::put('/profile/edit/{usr_id}', 'ProfileController@update')->name('profile.update');

【问题讨论】:

  • 表单中的提交按钮在哪里?\
  • 您好非常抱歉。我已经更新了我的问题。
  • 你为什么使用 type: 'put' 应该是 type: 'post',put imethod 只适用于 laravel 不适用于 javascript/jquery
  • 嗨@danny..我已经尝试过你的建议,但它仍然给我同样的错误。
  • 是 php 还是 javascript 错误?

标签: jquery html ajax laravel forms


【解决方案1】:

从空值创建默认对象

这个错误是由这段代码引起的

$profile->update();

您正在尝试更新一个空对象,因为

$profile = Profile::find($usr_id);

返回null

因为find 接受一个整数的主键,而你传递给它的是一个空值(假设这就是你所说的emp_id

这是验证 ID 是否存在的代码

<meta name="csrf-token" content="{{ csrf_token() }}">
<form class="form-horizontal" id="editProfile" data-parsley-validate>
    @method('PUT')
    <div class="row">
        <div class="col-md" style="padding:0px;">
            <input type="hidden" name="usr_id" id="usr_id">
            <input type="hidden" name="emp_id" id="emp_id" value="{{ $profile->emp_id }}">
        </div>
    </div>
    <button type="submit" id="submit" value="submit" class="btn btn-danger">Update</button>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>

为了简洁省略不相关的部分

并在分派 Ajax 请求之前验证值

    $(document).ready(function() {
    // Update Data

        $.ajaxSetup({
            headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        $('#editProfile').on('submit', function(e){
            e.preventDefault();

            var usr_id = $('#emp_id').val();

            if (usr_id < 1) {
                alert("Error: user id is null! make sure it has a value from the {{ $profile->emp_id }}");
                return;
            }

            $.ajax({
                type: "PUT",
                url: "/profile/edit/" + usr_id,
                dataType: $('#editProfile').serialize(),
                success: function (response) {
                    console.log(response);
                    alert("Data Updated");
                    location.reload();
                },
                error:function(error){
                    console.log(error);
                }
            });
        });

    });

在你的 update 函数中死掉并使用 dd 通过路由转储传递的 id

public function update(Request $request, $usr_id)
{
        // dd($usr_id);
   $profile = Profile::find($usr_id);

   $profile->first_name = $request->input('first_name');
   $profile->last_name = $request->input('last_name');
   $profile->update();
}

检查您是否从表单中收到了有效的 ID

希望对你有帮助

【讨论】:

  • 嗨@caddy DZ..非常感谢您的帮助。我完全接受您的建议,并将它们合并到我的代码中。 $usr_id 返回正确的值,它也存在于数据库中。 emp_id 不是主键,而是唯一键。尽管如此,代码并没有成功地将数据发送到表中。
  • 我将此 emp_id 更改为主键,现在代码运行没有任何错误。但是,随着提交,它已经删除了数据库中的所有现有数据。
  • 因为您正在修改配置文件而不是更新它
  • 这是一个不同的问题,如果这个答案解决了第一个问题,请考虑接受它,继续问另一个问题,我很乐意提供帮助
  • 嗨 Caddy DZ,根据您的建议,我能够解决所有问题。是的,这个emp_id 是一个VARCHAR。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多