WEBOPIXEL

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

Posted: 2018.05.15 / Category: PHP / Tag: 

Laravelでデータベーステーブルで一意であることをバリデートしたい場合「unique:テーブル名」と記述しますが、確かに追加する場合はちゃんとにバリデートしてくれますが、更新時も自分自身のレコードも含んでしまうので更新できなくなってしまいます。
この解決方法をご紹介します。

Sponsored Link

Laravel 5.5 を使用します。

文字列指定の場合

バリデーションを設定するとき、更新するレコードのIDは除外するという設定をする必要があります。
例えばTagsテーブルのslugカラムをユニークにしたいとします。
FormRequestに記述する場合は下記のようになります。

Http/Requests/TagRequest.php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TagRequest extends FormRequest
{

	public function authorize()
	{
		return true;
	}

	public function rules()
	{
		return [
			'slug' => 'unique:tags,slug,'.$this->route()->parameter('tag')
		];
	}
}

uniqueの3つめのパラメータに更新するレコードIDを指定します。
rulesでIDを取得する場合は$this->route()->parameter('tag')とします。

配列指定の場合

バリデーションは配列で指定することもできますよね。
その場合はignoreで除外するIDを指定します。

Http/Requests/TagRequest.php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class TagRequest extends FormRequest
{

	public function authorize()
	{
		return true;
	}

	public function rules()
	{
		return [
			'slug' => [
				Rule::unique('tags')->ignore($this->route()->parameter('tag'))
			]
		];
	}
}