簡體   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