Laravel - refresh 與 fresh 的差別

前言

在開發 Laravel 的應用中,有時會需要重新載入 Model 的內容,refreshfresh 都可以快速達到需求,雖然相似但畢竟是兩個不同的方法,當中還是有一些不同,以下會簡單比較下兩者的差異

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);