假設您正試圖創建一個新用戶,並使用用戶模型(使用軟刪除)爲其電子郵件地址設置了唯一的規則,但數據庫中存在已刪除的用戶。Laravel 4 - 如何使用軟刪除的唯一驗證規則/唯一列?
當試圖驗證新用戶的數據時,由於現有電子郵件,您將收到驗證錯誤。
我在我的控制器中做了一些額外的驗證,但是將它全部放在模型中不是很好嗎?
你會建議創建一個自定義驗證規則嗎?
因爲我現在還沒有找到一個乾淨的解決方案,所以我對其他人如何解決這個問題深表興趣。
假設您正試圖創建一個新用戶,並使用用戶模型(使用軟刪除)爲其電子郵件地址設置了唯一的規則,但數據庫中存在已刪除的用戶。Laravel 4 - 如何使用軟刪除的唯一驗證規則/唯一列?
當試圖驗證新用戶的數據時,由於現有電子郵件,您將收到驗證錯誤。
我在我的控制器中做了一些額外的驗證,但是將它全部放在模型中不是很好嗎?
你會建議創建一個自定義驗證規則嗎?
因爲我現在還沒有找到一個乾淨的解決方案,所以我對其他人如何解決這個問題深表興趣。
這聽起來像是您的業務邏輯問題,而不是技術問題。
軟刪除的目的是爲了允許將來可以恢復軟刪除記錄。但是,如果您的應用程序需要電子郵件的唯一性(這是完全正常的),則您不希望同時創建具有該電子郵件地址的新用戶,並且能夠恢復舊用戶,因爲這會違反唯一性要求。
因此,如果軟刪除記錄包含要添加爲新記錄的電子郵件地址,則應該考慮恢復原始記錄並將新的信息作爲更新應用於其中,而不是試圖繞過唯一性檢查來創建新記錄。
您的Eloquent模型應具有$softDeletes
屬性集。如果是這樣,那麼當您執行WHERE檢查時,如User::where('username', 'jimbob')
,Eloquent將自動在查詢WHERE deleted_at IS NULL
中添加...排除軟刪除項目。
的問題是,我現在用的是「獨一無二」的驗證規則和驗證類不使用進行檢查時的模型類,因此不會自動添加刪除。你會建議不使用驗證器,但將驗證添加到單獨的模型方法? – Remluben
查看API,似乎'DatabasePresenceVerifier'類使用查詢生成器來查詢表的存在。這就是說,它沒有考慮軟刪除。正如我在@kuroi之前提到的那樣,我想說爲什麼不先檢查帳戶有效性,然後在註冊之前還原該帳戶... –
您可以驗證通過額外的條件:
'unique:users,deleted_at,NULL'
Laravel提供了 「Additional Where Clauses」。
我的網址驗證規則(從更新模型法)看起來是這樣的:
$rules['url'] = 'required|unique:pages,url,'.$page->id.',id,deleted_at,NULL';
這意味着該URL必須是唯一的,必須忽略當前頁面,並忽略網頁,deleted_at
ID不NULL
。
希望這會有所幫助。
感謝您的回覆。不知何故,我設法忽略了長時間添加多個獨特規則依賴的可能性。儘管如此,我不確定是否應該像@petercoles 的回答中所描述的那樣改變我的業務邏輯(就像我那樣),還有Gabriel Koerich寫了一個類似於您的答案 – Remluben
是的!我自己同意@petercoles。擁有良好的商業邏輯會更好。 但有時你只需要有一個解決方法... 我很高興它幫助你! – adrianthedev
這是最好的辦法
'email' => 'required|email|unique:users,email,NULL,id,deleted_at,NULL',
它給你這個查詢
select count(*) as aggregate from `users` where `email` = ? and `deleted_at` is null
謝謝。它有助於顯示實際查詢對於獨特規則的用途,否則可能難以理解。 –
當我試圖更新模型時,它給了我一個錯誤,因爲這個電子郵件已經存在,是的,它確實存在,但它屬於我試圖更新的同一個實例! – ademin
您是否只是在此處發佈此信息:http:// forums .laravel.io/viewtopic.php?pid = 45610#p45610鬼鬼祟祟。 –
不打算偷偷摸摸。但作爲提問者在這兩個地方問,有點需要在兩個回答;) – petercoles
哦,不,不。完全所有這一切:] –