2013-07-03 87 views
10

假設您正試圖創建一個新用戶,並使用用戶模型(使用軟刪除)爲其電子郵件地址設置了唯一的規則,但數據庫中存在已刪除的用戶。Laravel 4 - 如何使用軟刪除的唯一驗證規則/唯一列?

當試圖驗證新用戶的數據時,由於現有電子郵件,您將收到驗證錯誤。

我在我的控制器中做了一些額外的驗證,但是將它全部放在模型中不是很好嗎?

你會建議創建一個自定義驗證規則嗎?

因爲我現在還沒有找到一個乾淨的解決方案,所以我對其他人如何解決這個問題深表興趣。

回答

14

這聽起來像是您的業務邏輯問題,而不是技術問題。

軟刪除的目的是爲了允許將來可以恢復軟刪除記錄。但是,如果您的應用程序需要電子郵件的唯一性(這是完全正常的),則您不希望同時創建具有該電子郵件地址的新用戶,並且能夠恢復舊用戶,因爲這會違反唯一性要求。

因此,如果軟刪除記錄包含要添加爲新記錄的電子郵件地址,則應該考慮恢復原始記錄並將新的信息作爲更新應用於其中,而不是試圖繞過唯一性檢查來創建新記錄。

+0

您是否只是在此處發佈此信息:http:// forums .laravel.io/viewtopic.php?pid = 45610#p45610鬼鬼祟祟。 –

+1

不打算偷偷摸摸。但作爲提問者在這兩個地方問,有點需要在兩個回答;) – petercoles

+0

哦,不,不。完全所有這一切:] –

0

您的Eloquent模型應具有$softDeletes屬性集。如果是這樣,那麼當您執行WHERE檢查時,如User::where('username', 'jimbob'),Eloquent將自動在查詢WHERE deleted_at IS NULL中添加...排除軟刪除項目。

+0

的問題是,我現在用的是「獨一無二」的驗證規則和驗證類不使用進行檢查時的模型類,因此不會自動添加刪除。你會建議不使用驗證器,但將驗證添加到單獨的模型方法? – Remluben

+0

查看API,似乎'DatabasePresenceVerifier'類使用查詢生成器來查詢表的存在。這就是說,它沒有考慮軟刪除。正如我在@kuroi之前提到的那樣,我想說爲什麼不先檢查帳戶有效性,然後在註冊之前還原該帳戶... –

16

您可以驗證通過額外的條件:

'unique:users,deleted_at,NULL' 
5

Laravel提供了 「Additional Where Clauses」。

我的網址驗證規則(從更新模型法)看起來是這樣的:

$rules['url'] = 'required|unique:pages,url,'.$page->id.',id,deleted_at,NULL'; 

這意味着該URL必須是唯一的,必須忽略當前頁面,並忽略網頁,deleted_at ID不NULL

希望這會有所幫助。

+0

感謝您的回覆。不知何故,我設法忽略了長時間添加多個獨特規則依賴的可能性。儘管如此,我不確定是否應該像@petercoles 的回答中所描述的那樣改變我的業務邏輯(就像我那樣),還有Gabriel Koerich寫了一個類似於您的答案 – Remluben

+0

是的!我自己同意@petercoles。擁有良好的商業邏輯會更好。 但有時你只需要有一個解決方法... 我很高興它幫助你! – adrianthedev

11

這是最好的辦法

 'email' => 'required|email|unique:users,email,NULL,id,deleted_at,NULL', 

它給你這個查詢

select count(*) as aggregate from `users` where `email` = ? and `deleted_at` is null 
+0

謝謝。它有助於顯示實際查詢對於獨特規則的用途,否則可能難以理解。 –

+0

當我試圖更新模型時,它給了我一個錯誤,因爲這個電子郵件已經存在,是的,它確實存在,但它屬於我試圖更新的同一個實例! – ademin