UNIQUE カラムのバリデーションで自分自身を除外して更新

2021/01/26

UNIQUE(重複)を含むデータの更新で、FormRequest や Validate で単純に unique を設定してしまうと、自分自身を更新できません。

code がユニークの場合

以下は、FormRequest の rulde() で items.code を UNIQUE 制約している例です。

配列の場合


'code' => ['required', 'string', 'unique:items'],

パイプの場合


'code' => 'required|string|unique:items',

この設定だと SQL の WHERE で更新しようとしてしまいます。


WHERE code = 'xxxx';

id を除外して code をユニークにする

よって items テーブルのプライマリーキー items.id を除外して更新するのがよいでしょう。

配列の場合


'code' => ['required', 'string', Rule::unique('items')->ignore($this->id)],

パイプの場合


'code' => "required|string|unique:items,code,{$this->id},id",

SQL の WHERE は以下のようになります。


WHERE code = 'xxxx' AND id <> 'xxxx'