認識 firstOrNew、firstOrCreate、firstOr 和 updateOrCreate 方法

laradocs發表於2021-09-27

前言

如果你使用過 Laravel,你可能知道建立 Eloquent 模型的標準方法,如 make()create()update()save()
Laravel 還包括了一些其他方法,它們對於建立和更新沒有得到足夠的關注和認識。
因此,在本文中,我將介紹一些額外的方法,並解釋它們的用處。

firstOrNew

firstOrNew 方法對於查詢匹配某些約束的第一個模型或在沒有匹配這些約束的情況下建立新模型非常有用。

假如你有一段程式碼:

$user = User::where ( 'email', request ( 'email' ) )->first();

if ( $user === null ) {
    $user = new User ( [ 'email' => request ( 'email' ) ] );
}

$user->name = request ( 'name' );

$user->save();

你可以把它變成這樣:

$user = User::firstOrNew ( [ 'email' =>  request ( 'email' ) ] );

$user->name = request ( 'name' );

$user->save();

如果找不到現有的模型,還可以傳遞一組附加屬性以設定為第二個引數:

$user = User::firstOrNew (
    [ 'email' =>  request ( 'email' ) ],
    [ 'name' => request ( 'name' ) ]
);

$user->save();

firstOrCreate

firstOrCreatefirstOrNew 方法非常相似,它會嘗試查詢與您在第一個引數中傳遞的屬性相匹配的模型。
如果找不到模型,則在應用第二個引數中傳遞的任何屬性後,它會自動建立並儲存一個新模型:

$user = User::firstOrCreate (
    [ 'email' =>  request ( 'email' ) ],
    ['name' => request ( 'name' ) ]
);

// 這裡不需要呼叫 $user->save();

firstOr

firstOr 方法從查詢中檢索第一個模型,如果沒有找到匹配的模型,它將呼叫傳遞的回撥。

$user = User::where ( 'email', request ( 'email' ) )->firstOr ( function () {
    $account = Account::create ( [ //... ] );

    return User::create ( [
        'account_id' => $account->id,
        'email' => request ( 'email' ),
    ] );
} );

updateOrCreate

updateOrCreate 方法嘗試查詢與作為第一個引數傳遞的約束條件匹配的模型。
如果找到匹配的模型,它將使用作為第二個引數傳遞的屬性更新匹配項。
如果沒有找到匹配的模型,將使用第一個引數傳遞的約束和第二個引數傳遞的屬性建立一個新模型。

假如你有一段程式碼:

$user = User::where ( 'email', request ( 'email' ) )->first();

if ( $user !== null ) {
    $user->update ( [ 'name' => request ( 'name' ) ] );
} else {
    $user = User::create ( [
      'email' => request ( 'email' ),
      'name' => request ( 'name' ),
    ] );
}

使用 updateOrCreate 方法:

$user = User::updateOrCreate (
    [ 'email' =>  request ( 'email' ) ],
    [ 'name' => request ('name' ) ]
);

總結

我認為在某些情況下這些方法可以幫助你優化程式碼,並且,這是 Laravel 中的最佳選擇。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
站在巨人的肩上

相關文章