やりたいこと
Laravelバリデーションのuniqueについて、新規登録時と更新時で挙動を変えたい。
詳細は下記。
対象
- 会社テーブル(companies)の会社名カラム(name)
条件
- 新規登録時
- すでに登録されている会社名と同じものは登録できないようにする
- 論理削除されたものは対象外
- 更新時
- すでに登録されている会社名と同じものは登録できないようにする
- 論理削除されたものは対象外
- 自分自身(今更新しようとしているデータ)はunique除外
- 会社名以外の項目を更新した時にバリデーションがかかると更新ができないため
実装
カスタムリクエストで書いていきます。
app/Http/Requests/CompanyRequest.php
// rulesメソッドだけ抜き取り
public function rules()
{
$companyId = (int)$this->route('company');
return [
'name' => ['required', Rule::unique('companies')->ignore($companyId)->whereNull('deleted_at')],
'post_code' => ['required'],
'address' => ['required'],
];
}
$this->route('company')
のcompany
は、ルーティングで設定しているルートパラメータの値です。
routes/web.php
Route::resource('/company', CompanyController::class)->except('show');
上記の場合、リソースコントローラーを使用しているので、ルートパラメータはcompany
となります。
※リソースコントローラーについては下記をご確認ください。
https://readouble.com/laravel/9.x/ja/controllers.html
論理削除されたものを対象外にするのは、->whereNull('deleted_at')
の部分。
以上!
自分用のメモですが、誰かの参考になれば幸いです。