2017-02-08 85 views
7

如何在2個字段上擁有唯一的驗證規則?使用2個字段的Laravel表單驗證唯一

a。應用程序不應該允許兩個人具有相同的名字和姓氏。

允許用戶只填寫名字或只填寫姓氏。因爲用戶可能只有其中一個。

b。但是如果用戶只輸入第一個名字(Glen),那麼表格中的其他人不應該有相同的名字(名字='Glen'和姓氏=空)。另一個'格倫史密斯'確定。

我嘗試了以下規則。當兩個字段(名字和姓氏)都不爲空時,它很好用:

'firstName' => 'unique:people,firstName,NULL,id,lastName,' . $request->lastName 

此規則在b上失敗。當只有一個字段存在時。

任何提示?

回答

7

內置的unique驗證器不會真的支持你想要做的事情。目的是確保數據庫中的單個有效數據是唯一的,而不是兩個值的組合。但是,您可以創建一個custom validator

Validator::extend('uniqueFirstAndLastName', function ($attribute, $value, $parameters, $validator) { 
    $count = DB::table('people')->where('firstName', $value) 
           ->where('lastName', $parameters[0]) 
           ->count(); 

    return $count === 0; 
}); 

然後,您就可以訪問這個新的規則:

'firstName' => "uniqueFirstAndLastName:{$request->lastName}" 

你可能會發現你可能需要調整你的數據庫查詢一點點,因爲它是未經測試。

+1

開箱即可使用:) 非常感謝! – Warrio

+1

當驗證更新表單時,我們需要通過增加一個額外的where子句來排除當前記錄: - > where('id','<>',$ parameters [1]) 並且像這樣調用它 ' firstName'=>「uniqueFirstAndLastName:{$ request-> lastName},{$ request-> id}」 – Warrio