Laravel的unique和exists驗證規則的優化

pilishen發表於2019-02-28

本文是Laravel實戰:任務管理系統(一)的擴充套件閱讀

原文連結; 歡迎作客我們的php&Laravel學習群:109256050

Laravel中通過ValidatesRequests這個trait來驗證requests非常的方便,並且在BaseController類中它被自動的引入了。
exitsts()和unique()這兩個規則非常的強大和便利。它們在使用的過程中需要對資料庫中已有的資料進行驗證,通常它們會像下面這樣來寫:

// exists example
`email` => `exists:staff,account_id,1`
// unique example
`email` => `unique:users,email_address,$user->id,id,account_id,1`
複製程式碼

上面這種寫法的語法很難記,我們幾乎每次使用時,都不得不去查詢一下文件。但是從 Laravel 的5.3.18版本開始這兩個驗證規則都可以通過一個新的Rule類來簡化。

我們現在可以使用下面這樣的熟悉的鏈式語法來達到相同的效果:

`email` => [
    `required`,
    Rule::exists(`staff`)->where(function ($query) {
        $query->where(`account_id`, 1);
    }),
],
複製程式碼
`email` => [
    `required`,
    Rule::unique(`users`)->ignore($user->id)->where(function ($query) {
        $query->where(`account_id`, 1);
    })
],
複製程式碼

這兩個驗證規則還都支援下面的鏈式方法:

  • where
  • whereNot
  • whereNull
  • whereNotNull

unique驗證規則除此之外還支援ignore方法,這樣在驗證的時候可以忽略特定的資料。

好訊息是現在仍然完全支援舊的寫法,並且新的寫法實際上就是通過formatWheres方法在底層將它轉換成了舊的寫法:

protected function formatWheres()
{
    return collect($this->wheres)->map(function ($where) {
        return $where[`column`].`,`.$where[`value`];
    })->implode(`,`);
}
複製程式碼

原文地址連結

相關文章