【问题标题】:Eloquent Update using ajax not updating使用 ajax 的雄辩更新不更新
【发布时间】:2020-12-12 19:18:52
【问题描述】:

我尝试了几种解决方案,这个确实有效,但我似乎无法更新正在传递的信息。

view.blade.php

<script>
$(document).ready(function(){
    $('#frmUpdate').on('submit', function(e){
        e.preventDefault();
        // var $Firstname = $('#Firstname').val();
        // var $Lastname = $('#Lastname').val();
        // var $Phone = $('#Phone').val();
        // var $Email = $('#Email').val();
        // var $Address = $('#Address').val();
        // var $username = $('#username').val();

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

        $.post({
            url:url,
            data:{data},
            success:function(data){
                console.log(data);
                alert("Your Information has been updated.");
            },
            error:function(data){
                alert("Internal Server Error");
            }
        });
    });
});
</script>


 <form action="{{ URL::to('/update') }}" method="post" id="frmUpdate">
            @csrf
            <div class="modal-body">
                <input type="hidden" id="id" name="id" value="{{ Auth::user()->id }}">
                <input type="hidden" id="username" name="username" value="{{ Auth::user()->Username }}">
                <div class="form-row">
                    <div class="form-group col-sm-12">
                        <input id="Firstname" type="text" class="form-control form-control-lg @error('Firstname') is-invalid @enderror" placeholder="{{__('Firstname')}}" name="Firstname" required value="{{ Auth::user()->FirstName }}">
                        @error('Firstname')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-md-12 col-sm-12">
                        <input id="Lastname" type="text" class="form-control form-control-lg @error('Lastname') is-invalid @enderror" placeholder="{{__('Lastname')}}" name="Lastname" required value="{{ Auth::user()->LastName }}">
                        @error('Lastname')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-md-12 col-sm-12">
                        <input id="Phone" type="text" class="form-control form-control-lg @error('Phone') is-invalid @enderror" onkeypress="return isNumberKey(event)" placeholder="{{__('Phone Number')}}" name="Phone" required value="{{ Auth::user()->MobileNum }}">
                        @error('Phone')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-md-12 col-sm-12">
                        <input id="Email" type="email" class="form-control form-control-lg @error('Email') is-invalid @enderror" placeholder="{{__('Email')}}" name="Email" required value="{{ Auth::user()->email }}">
                        @error('Email')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-md-12">
                        <textarea id="Address" type="text" class="form-control form-control-lg @error('Address') is-invalid @enderror" name="Address" placeholder="{{__('Address')}}" required>{{ Auth::user()->Address }}</textarea>
                        @error('Address')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
                <button type="submit" id="updateInfo" class="btn btn-primary">Save</button>
            </div>
        </form>

控制器.php

public function update(Request $request){
        // $this->validate($request,[
        //     'Firstname' => 'required|max:255',
        //     'Lastname' => 'required|max:255',
        //     'Email' => 'required|email',
        //     'Address' => 'required'
        // ]);
        if($request->ajax()){
        $data = [
            'FirstName' => $request->input('Firstname'),
            'LastName' => $request->input('Lastname'),
            'MobileNum' => $request->input('Phone'),
            'email' => $request->input('Email'),
            'Address' => $request->input('Address')
        ];
        $user = User::find(Auth::user()->id);
        $user->update($request->all());

        // $message = "Your information has been updated!";
        // $request->session()->flash('success', $message);

            return  response(User::find($user->id));
        }
    }

如您所见,我尝试使用 $data 数组,但它不起作用,而是传递了一个非常奇怪的空值。所以我尝试了$request-&gt;all() 我看到了一个使用这个的教程,所以我试了一下。它确实更新了,但也传递了空值。

模型.php

protected $table = 'tableName';
    protected $primaryKey = 'id';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'Username','password','MobileNum','AccountNum','FirstName','LastName','Address','email'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function getAuthPassword()
    {
        return $this->password;
    }

    public static function updateData($username,$data){
        User::where('Username', $username)->update($data);
     }

【问题讨论】:

  • 您必须先定义fillable 到用户模型,然后才能使用质量分配对link 进行详细检查
  • 我已经在我的模型上添加了flilable
  • 请分享用户模型。
  • 刚刚编辑过!我现在仍在寻找解决方案。
  • @error500 当您调用$user-&gt;update() 时,它只是在幕后执行$user-&gt;fill()-&gt;save()

标签: ajax laravel eloquent


【解决方案1】:

这里的主要问题是您将数据嵌套在 ajax 调用中,即data: {data}。这意味着序列化的字符串将作为主体的子属性而不是主体本身传递,因此服务器不会解析它。

如果您执行dd(request()-&gt;input()),您应该会看到类似:

"data" => "_token=HICWYthxeeHnUHoWVWhG6xksvKCe6eaAx8vIwnsB&Firstname=Firstname&Lastname=Lastname&Phone=Phone&Email=Email&Address=Address"

而不是:

"_token" => "HICWYthxeeHnUHoWVWhG6xksvKCe6eaAx8vIwnsB"
"Firstname" => "Firstname"
"Lastname" => "Lastname"
"Phone" => "Phone"
"Email" => "Email"
"Address" => "Address"

要解决这个问题,请不要将 data 包裹在 {} 中,即

$.post({
    url: url,
    data: data, //<-- here
    success: function (data) {
        console.log(data);
        alert("Your Information has been updated.");
    },
    error: function (data) {
        alert("Internal Server Error");
    }
});

在您的控制器中不需要User::find(Auth::user()-&gt;id),因为您只需执行Auth::user()。现在你基本上是在说给我用户,然后用你刚刚给我的用户的 id 再次找到用户。

您也不需要重新获取用户作为控制器的末尾,您可以简单地返回Auth::user()

你的控制器代码可能看起来像:

public function update(Request $request)
{
    $data = $this->validate($request, [
        'Firstname' => 'required|max:255',
        'Lastname'  => 'required|max:255',
        'Email'     => 'required|email',
        'Address'   => 'required',
        'MobileNum' => 'nullable', //<-- assuming this can be nullable as it wasn't included in your original validation
    ]);

    Auth::user()->fill($data)->save();

    return Auth::user();
}

【讨论】:

  • 感谢您的解释!我现在有点明白了。所以这就是我得到 "data" =&gt; "_token=HICWYthxeeHnUHoWVWhG6xksvKCe6eaAx8vIwnsB&amp;Firstname=Firstname&amp;Lastname=Lastname&amp;Phone=Phone&amp;Email=Email&amp;Address=Address" 的原因,因为大括号。传递像data:{user:user} 这样的值时,我会使用大括号,对吗?顺便说一句,感谢您的帮助和解释清楚!
  • @PlayFree 很高兴我能帮上忙!是的,这是对的。如果要传递单个属性,可以将它们作为对象传递。您只是无法将序列化数据与之混合:)
猜你喜欢
  • 2020-05-30
  • 2018-05-19
  • 2013-05-31
  • 2020-02-14
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多