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)
]
];
}
}

