前言
在開發 Laravel 的應用中,有時會需要重新載入 Model 的內容,refresh
與 fresh
都可以快速達到需求,雖然相似但畢竟是兩個不同的方法,當中還是有一些不同,以下會簡單比較下兩者的差異
Refresh
原始碼的註解
https://github.com/laravel/framework/blob/8209afde1d14d4342ecb1457b7e6ee2ce51caee1/src/Illuminate/Database/Eloquent/Model.php#L1680
1
| Reload the current model instance with fresh attributes from the database.
|
從註解當中可以大概了解:
Refresh 會重新進行資料庫查詢,並更新本身的 model 資料
可參考以下程式碼了解用法
1 2 3 4 5 6 7 8 9 10 11 12 13
| $user = User::factory()->create(['name'=>'user1']);
dump($user->name); // 先確認目前資料 // user1
DB::table('users')->update(['name'=>'user2']);
$user->refresh(); dump($user->name); // 使用 refresh 後 // user2
|
Fresh
原始碼註解
https://github.com/laravel/framework/blob/8209afde1d14d4342ecb1457b7e6ee2ce51caee1/src/Illuminate/Database/Eloquent/Model.php#L1662
1
| Reload a fresh model instance from the database.
|
從註解可得知:
Fresh 一樣會重新進行資料庫的查詢,但會直接回傳新的 Model
可參考以下程式碼了解用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $user = User::factory()->create(['name'=>'user1']);
dump($user->name); // 先確認當前資料 // user1
DB::table('users')->update(['name'=>'user2']);
$user->fresh(); dump($user->name); // 對原本 Model 執行 `fresh` // user1
$freshUser = $user->fresh(); dump($freshUser->name); // 使用 `fresh` 後儲存 // user2
|
另外如果需要載入關聯,可以傳入 $with
1
| $freshUser = $user->fresh($with);
|