📐

LaravelのValidationでdifferentを使用した際、重複した内容のエラーがでないようにする

2022/11/11に公開

概要

Laravelでデータの更新フォームのValidationを実装したときdifferentの設定の仕方を間違えて、ユーザーに重複したエラーを表示するよう実装しそうになったので、その改善をしたという内容です。
Laravelでdifferentあまり使ったことがない人が対象になります。

ちなみにdifferentとは...

LaravelのValidation ruleの一つで、フィールドが指定されたフィールドと異なった値を指定されていることをバリデートするというものです。
参考: Laravel 9.x バリデーション

環境

  • php: 8.0.2
  • Laravel: 9.28

要件

データの更新フォームに入力された機器番号Aと機器番号Bにそれぞれ重複がない状態を正としたいというものです。例えば下記のようなデータとしましょう。

Validationにひっかかるパターン

機器番号 入力された値
machine_id_a 0000
machine_id_b 0000

Validationにひっかからないパターン

機器番号 入力された値
machine_id_a 0000
machine_id_b 1234

実装方法

最初こう書いてました。

Bad...

class UpdateRequest extends FormRequest
{
    public function rules()
    {
        return [
            'machine_id_a' => [
                'different:machine_id_b',
            ],
            'machine_id_b' => [
                'different:machine_id_a',
            ],
        ];
    }
}

Validationに引っかかるパターンの入力値が送信された場合、エラーの出力結果はこうなります。

1. machine_id_aとmachine_id_bには、異なるものを指定してください。
2. machine_id_bとmachine_id_aには、異なるものを指定してください。

人間が受け取る意味合いとしては同じものが出力されてしまいました。

Good!

というわけで下記のように書き直しました。

class UpdateRequest extends FormRequest
{
    public function rules()
    {
        return [
            'machine_id_a' => [
                'different:machine_id_b',
            ],
        ];
    }
}

Validationに引っかかるパターンの入力値が送信された場合、エラーの出力結果はこうなります。

1. machine_id_aとmachine_id_bには、異なるものを指定してください。

これでユーザーに重複した内容のエラーが表示されなくなりました。

まとめ

differentを使うときは、重複してほしくない値のどちらか一方にのみdifferentをつけましょう。

Discussion