繁体   English   中英

如何在 Laravel 5.6 中使用路由模型绑定更新用户

[英]How to update an user using Route Model Binding in Laravel 5.6

我有一个个人资料视图,我想在其中更新用户个人资料。

我的控制器:

public function update(Request $request, User $user)
    {

        $validatedData = $request->validate([

            'name' => 'required',
            'email' =>'required|email',
            'key' => 'required'

        ]);

        // dd($user);

        $user->update($validatedData);

        // User::whereId($user->id)->update($validatedData);

        return back()->with('flash', 'Successfully updated profile.');

    }

我正在将模型的实例注入我的路线。 当我dd($user)我得到当前用户实例。 在此处输入图片说明 现在我想用validatedData 更新用户。 但不幸的是这个$user->update($validatedData); 不管用。 我不明白为什么...这个User::whereId($user->id)->update($validatedData); 正在工作,但调用user user->id感觉很奇怪。

了解两个相似调用之间的区别很重要。

whereId()返回查询构建器的一个实例,因此您不再调用模型上的方法。 所以 update() 是查询构建器调用,而不是模型调用。

find() (或路由模型绑定)将返回模型的实例。 因此,您将从模型本身调用 update()。

Eloquent 模型具有内置的质量分配保护。我的假设是您的一个或多个列不在模型的$fillable数组中。 要么将每一列显式添加到$fillable数组中,要么删除$fillable数组并显式添加不应批量分配给$guarded数组的每一列。

https://laravel.com/docs/5.6/eloquent#mass-assignment

如果您尝试更新 remenber 将字段声明为模型上的 $fillable 属性。

protected $fillable = ['name','email','key'];

之后,您可以使用路由模型绑定更新模型

我昨天遇到了这个。 我正在使用模型路由绑定进行删除操作。 所以,我将唯一的用户 ID 传递给 DELETE 路由,并在路由中提示 {user} 如下:

Route::middleware(['auth:sanctum', 'verified'])
    ->delete('/users/delete/{user}', [UserController::class, 'delete'])
    ->name('users.delete')
    ->where('id', '[0-9]+');

控制器的工作方式如此简单:

  public function delete(User $user) {

    $user->delete();

    return Redirect::route('users')
      ->with('success', "User $user->id $user->name was deleted successfully");
  }

我很高兴用户对象可用于 Flash 消息。

使用相同的过程,我想添加一个用户更新操作。 所以,我做了同样的事情,我只将用户 ID 发送到 PUT 路由并再次提示用户:

Route::middleware(['auth:sanctum', 'verified'])
  ->put('/users/edit/{user}', [UserController::class, 'edit'])
  ->name('users.edit')
  ->where('id', '[0-9]+');

我到了控制器,可以转储用户对象。 所以,我尝试了一个简单的更新,如下所示:

 public function edit(User $user)
  {
    $user->update(
      [
        'name' => user->name,
        'email' => user->email,
      ]
    );
  }

我没有收到任何错误,更新返回 true。 但是我的数据没有反映预期的变化......

然后,在车上过了一会儿,我意识到,通过模型路由绑定,路由正在查询数据库中的现有用户。 因此,如果我在控制器中分配来自该用户对象的值,则不会发生任何变化!

::面部护理::

因此,删除操作可以正常工作是有道理的,但是对于更新操作,您必须在更新期间从请求中分配更改的值。 因为请求中的值可能与现有的用户对象值不同:

      public function edit(Request $request, User $user)
      {
        $user->update(
          $request->validate([
            'name' => 'required|string',
            'email' => 'required|email',
          ])
        );
    
        return Redirect::route('users')
          ->with('success', "User $user->id $user->name was updated successfully");
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM