2013-07-03 3 views
10

新しいユーザーを作成しようとしていますが、ユーザーのモデル(ソフト削除を使用)に電子メールアドレスの一意の規則がありますが、データベース内にゴミ箱があります。Laravel 4 - 一意の検証ルールを使用する方法/ソフト削除のある一意の列?

新しいユーザーのデータを検証しようとすると、既存の電子メールのために検証エラーが発生します。

私はControllers内で何らかの追加の検証を行ったが、モデル内でそれをすべて持っているのはいいことではないだろうか?

カスタム検証ルールを作成することをおすすめしますか?

私は今、きれいな解決策を見つけられなかったので、他の人たちがこの問題をどのように解決したかについて私は洞察しています。

答えて

14

これは技術的な問題ではなくビジネスロジックの問題のようです。

ソフト削除の目的は、ソフト削除されたレコードが将来復元される可能性を許容することです。ただし、アプリケーションで電子メールの一意性(完全に正常)が必要な場合は、その電子メールアドレスを持つ新しいユーザーを作成し、古いユーザーを復元することはできません。

新しいレコードとして追加する電子メールアドレスを含むソフト削除されたレコードがある場合は、元のレコードを復元し、新しい情報を更新として適用することを検討してください新しいレコードを作成する一意性検査。

+0

http:// forums .laravel.io/viewtopic.php?pid = 45610#p45610こんにちは。 –

+1

卑劣ではありません。しかし、質問者が両方の場所で尋ねているので、ちょっと両方に答えが必要です;) – petercoles

+0

ああ、いいえ。完全にそのために:] –

0

あなたのEloquentモデルは、$softDeletesプロパティセットを持つ必要があります。その場合、User::where('username', 'jimbob')のようなWHEREチェックを実行すると、Eloquentは自動的にクエリWHERE deleted_at IS NULLを追加します。これはソフト削除されたアイテムを除外します。

+0

を与え、Validatorクラスを使用していない最善のアプローチ

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

ですチェックを行うときにモデルクラスを作成します。したがって、自動的に削除されたものを追加しません。 Validatorを使用せず、別のモデルメソッドに検証を追加することをお勧めしますか? – Remluben

+0

APIを見ると、 'DatabasePresenceVerifier'クラスはクエリビルダーを使用して存在をテーブルに照会しているようです。これで、ソフト削除を考慮しません。 @kuroiの前に言及しようとしていたように、私は口座の有効性を最初に確認してから、登録前にアカウントを復元してみてはいかがですか。 –

16

あなたは余分な条件を渡して検証することができます。

'unique:users,deleted_at,NULL' 
5

Laravelは "Additional Where Clauses" を提供しています。

更新モデル法から)私のURLの検証ルールは次のようになります。

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

これはURLは一意でなければならないことを意味し、現在のページを無視し、deleted_at IDでないページを無視しなければなりませんNULL

これが役に立ちます。

+0

返信いただきありがとうございます。何とか私はかなり長い間、複数のユニークなルールの依存関係を追加する可能性を無視することができました。それでも、私のビジネスロジックを変更する方が良いかどうかは、@petercolesの答えに記載されているように また、Gabriel Koerichはあなたの答えに似ています – Remluben

+0

Yeah!私は自分自身@petercolesに同意します。良いビジネスロジックを持つ方が良いです。 しかし時には回避策が必要なだけです... それがあなたを助けてくれてうれしいです! – adrianthedev

11

これは、それは私が「ユニーク」検証ルールを使用していますことを、あなたに問題があるこのクエリ

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

ありがとうございます。これは、実際のクエリがユニークなルールにどのようなものになるかを示すのに役立ちます。そうでなければ、理解するのが難しいでしょう。 –

+0

私はモデルを更新しようとしているとき、この電子メールがすでに存在しているのでエラーが表示されます。はい、存在していますが、更新しようとしているインスタンスに属しています。 – ademin

関連する問題