[英]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數組的每一列。
如果您嘗試更新 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.