15
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravelでuniqueの対象から自分自身の値を外す

Posted at

問題

  • ユーザー情報の編集や更新をするフォームを作ってバリデーションを設けた
  • ユーザー名メールアドレスにuniqueを適用した
  • uniqueの対象以外の情報を変更したいのに、uniqueに引っかかってしまって、その先に進めない

この職種のDELETE_FLAGを変更したいのに、
image.png

uniqueが適用されている職種名のエラーが出てきてしまう。
image.png

コード

現在のコード、バリデーションはこのような状態

Works/EditCheckController.php
$validator = Validator::make($request->all(), [
    'edit_name' => 'required|max:20|unique:works,works_name',
    'edit_flag' => 'boolean',
],
[
    'edit_name.required' => '職種名を入力してください。',
    'edit_name.max' => '職種名は20字以内で入力してください。',
    'edit_name.unique' => 'この職種名は既に登録されています。',
    'edit_flag.boolean'  => '0か1を入力してください。',
]);

解決策

uniqueの引数を増やす

Works/EditCheckController.php
$validator = Validator::make($request->all(), [
    'edit_name' => 'required|max:20|unique:works,works_name,'.$request -> edit_id.',works_id',
    'edit_flag' => 'boolean',
],
[
    'edit_name.required' => '職種名を入力してください。',
    'edit_name.max' => '職種名は20字以内で入力してください。',
    'edit_name.unique' => 'この職種名は既に登録されています。',
    'edit_flag.boolean'  => '0か1を入力してください。',
]);

uniqueの内容は、
unique: uniqueチェックをしたいテーブル名, uniqueチェックをしたいカラム名,.uniqueチェックの対象外にしたいデータがあるレコードの主キー.',uniqueチェックの対象外にしたいデータがあるレコードの主キーのカラム名'
となっている。

処理の内容としては、

  • uniqueチェックをした時の主キー対象外にしたいデータがあるレコードの主キーが一致すれば、uniqueの結果を返さない
  • uniqueチェックをした時の主キー対象外にしたいデータがあるレコードの主キーが一致しなければ、uniqueの結果を返す

(であってるはず)

確認

uniqueの対象となっているWORKS_NAMEを変更せずに他のデータを編集できるようになり、
image.png

既に登録されているデータはuniqueの対象にすることができた。
image.png

参考文献

15
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?