teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

修正

2021/07/20 10:06

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,18 +1,20 @@
1
- **【回答が間違っていそうなので修正中】**
1
+ [https://github.com/illuminate/validation/blob/74e13a98299bbc3c48c5131a9239b9ad499a4efe/DatabasePresenceVerifier.php#L108](https://github.com/illuminate/validation/blob/74e13a98299bbc3c48c5131a9239b9ad499a4efe/DatabasePresenceVerifier.php#L108)
2
2
 
3
+ を確認しました。 `NOT NULL` じゃなくて **`NOT_NULL`** のようです。
4
+
3
5
  ----
4
6
 
5
- ここからは個人的な意見ですが,そもそも **リクエストバリデーションでユニークをチェックするのはおすすめしません。データベースアクセスが不要なフォーマット的なチェックだけを行いましょう**
7
+ 個人的な意見ですが,そもそもリクエストバリデーションでユニークをチェックするのはあまりおすすめしません。データベースアクセスが不要なフォーマット的なチェックだけを行うほうが,バリデーションルールが散らからなと思い
6
8
 
7
9
  - [5年間 Laravel を使って辿り着いた,全然頑張らない「なんちゃってクリーンアーキテクチャ」という落としどころ](https://zenn.dev/mpyw/articles/ce7d09eb6d8117)
8
10
 
9
- 上記におおまかな方針を示してあるで,参考に読んでみてください。上記の理論に基づいて今回のバリデーションを書くなら
11
+ 上記の理論に基づいて今回のバリデーションを書くなら
10
12
 
11
13
  ```php
12
14
  // email が文字列であることはバリデーション済みであると想定
13
15
 
14
16
  if (User::query()->where('email', $email)->exists()) {
15
- throw new DuplicateEmailException($email);
17
+ throw new DuplicateEmailException($email); // 独自に設けた例外
16
18
  }
17
19
  ```
18
20
 
@@ -20,6 +22,6 @@
20
22
 
21
23
  ---
22
24
 
23
- また蛇足ですが,論理削除とユニーク制約は両立可能なので,こちらも参照してみてください。整合性に対する信頼性が大きく向上します。
25
+ 更に蛇足ですが,論理削除とユニーク制約は両立可能なので,こちらも参照してみてください。整合性に対する信頼性が大きく向上します。
24
26
 
25
27
  - [MySQLでLaravel標準のSoftDeletesを使った論理削除とユニーク制約を両立させる方法 - Qiita](https://qiita.com/mpyw/items/d3e25860ecaaeb8340ab)

3

いったん消す

2021/07/20 10:06

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,35 +1,5 @@
1
1
  **【回答が間違っていそうなので修正中】**
2
2
 
3
- -----
4
-
5
- [https://github.com/illuminate/validation/blob/9cb3e3a6871925cd7344eb28078784c6de0ba2e2/Rules/Unique.php#L67-L73](https://github.com/illuminate/validation/blob/9cb3e3a6871925cd7344eb28078784c6de0ba2e2/Rules/Unique.php#L67-L73)
6
-
7
- を見た感じ, `unique:` は引数を 5 個しか取りませんね。つまり
8
-
9
-
10
- ```php
11
- 'email' => [
12
- 'unique:users,email,null,id,deleted_at,NULL',
13
- ]
14
- ```
15
-
16
-
17
-
18
- ```php
19
- 'email' => [
20
- 'unique:users,email,null,id,deleted_at',
21
- ]
22
- ```
23
-
24
- とみなされている可能性が高いです。使われていない引数なので, `NULL` を `NOT NULL` にしても動作が何も変わらないのは期待された動きです。そもそもそういう使い方が想定されていないので。
25
-
26
- そして
27
-
28
- - [https://github.com/illuminate/validation/blob/9cb3e3a6871925cd7344eb28078784c6de0ba2e2/Concerns/ValidatesAttributes.php#L716-L760](https://github.com/illuminate/validation/blob/9cb3e3a6871925cd7344eb28078784c6de0ba2e2/Concerns/ValidatesAttributes.php#L716-L760)
29
- - [https://github.com/laravel/framework/blob/c7824d4e163947331d2676dc35213126499736a1/src/Illuminate/Validation/DatabasePresenceVerifier.php#L36-L55](https://github.com/laravel/framework/blob/c7824d4e163947331d2676dc35213126499736a1/src/Illuminate/Validation/DatabasePresenceVerifier.php#L36-L55)
30
-
31
- このへんを読んだ感じだと, `NOT NULL` をつけるのは,既存のバリデーションルールでは厳しそうです。 `PresenceVerifier` をカスタムして注入して動きを変えるなど,高度なやり方が必要になってきます。
32
-
33
3
  ----
34
4
 
35
5
  ここからは個人的な意見ですが,そもそも **リクエストバリデーションでユニークをチェックするのはおすすめしません。データベースアクセスが不要なフォーマット的なチェックだけを行いましょう**。

2

修正中

2021/07/20 10:03

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,3 +1,7 @@
1
+ **【回答が間違っていそうなので修正中】**
2
+
3
+ -----
4
+
1
5
  [https://github.com/illuminate/validation/blob/9cb3e3a6871925cd7344eb28078784c6de0ba2e2/Rules/Unique.php#L67-L73](https://github.com/illuminate/validation/blob/9cb3e3a6871925cd7344eb28078784c6de0ba2e2/Rules/Unique.php#L67-L73)
2
6
 
3
7
  を見た感じ, `unique:` は引数を 5 個しか取りませんね。つまり

1

追記

2021/07/20 10:00

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -32,4 +32,20 @@
32
32
 
33
33
  - [5年間 Laravel を使って辿り着いた,全然頑張らない「なんちゃってクリーンアーキテクチャ」という落としどころ](https://zenn.dev/mpyw/articles/ce7d09eb6d8117)
34
34
 
35
- 上記におおまかな方針を示してあるので,参考に読んでみてください。
35
+ 上記におおまかな方針を示してあるので,参考に読んでみてください。上記の理論に基づいて今回のバリデーションを書くなら
36
+
37
+ ```php
38
+ // email が文字列であることはバリデーション済みであると想定
39
+
40
+ if (User::query()->where('email', $email)->exists()) {
41
+ throw new DuplicateEmailException($email);
42
+ }
43
+ ```
44
+
45
+ のようなイメージになります。
46
+
47
+ ---
48
+
49
+ また蛇足ですが,論理削除とユニーク制約は両立可能なので,こちらも参照してみてください。整合性に対する信頼性が大きく向上します。
50
+
51
+ - [MySQLでLaravel標準のSoftDeletesを使った論理削除とユニーク制約を両立させる方法 - Qiita](https://qiita.com/mpyw/items/d3e25860ecaaeb8340ab)