Laravelのuniqueバリデーションで更新(アップデート)できない場合の解決方法

Posted: 2018.05.15 / Category: PHP / Tag: Laravel
Laravelでデータベーステーブルで一意であることをバリデートしたい場合「unique:テーブル名」と記述しますが、確かに追加する場合はちゃんとにバリデートしてくれますが、更新時も自分自身のレコードも含んでしまうので更新できなくなってしまいます。
この解決方法をご紹介します。
Sponsored Link
Laravel 5.8 を使用します。
文字列指定の場合
バリデーションを設定するとき、更新するレコードのIDは除外するという設定をする必要があります。
例えばPostsテーブルのslugカラムをユニークにしたいとします。
FormRequest
に記述する場合は下記のようになります。
Http/Requests/PostRequest.php
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class PostRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'slug' => 'unique:posts,slug,' . $this->post->id, ]; } }
unique
の3つめのパラメータに更新するレコードIDを指定します。
$this->post->id
で取得できます。
ただこの方法は新規作成時の場合はidがないので、このままでとエラーになります。
条件分岐などして処理を切り分ける必要がありますので、後述の配列で記述する方法がおすすめです。
配列指定の場合
バリデーションは配列で指定することもできますよね。
その場合はignore
で自身を指定します。
Http/Requests/PostRequest.php
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; class PostRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'slug' => [ Rule::unique('posts')->ignore($this->post) ] ]; } }