2重登録をさせたくない時はバリデーションの’unique’を使えば良いけど、このuniqueってupdateの時にも該当する。つまり、更新しようとしているのに”2重登録ですよ”って言われてしまうのでその対処方法。
uniqueの第3パラメータと第4パラメータで、この値(第3パラメータ)とこのカラム(第4パラメータ)が一致するレコードには、このルールは適用させないということが出来るので、これを利用する。
例)同一メールアドレスの重複登録をさせない場合
'email' => ['required', 'email', 'unique:admins'],
こうすることで、postされたemail変数の値は必須であり、メールアドレス形式であり、adminsテーブルのemailカラムに存在しないことというルールが定義でき、新規登録の場合は問題ないが、更新時もこのルールが適用されてしまい更新することが出来ない。
なので、以下の様に変更
'email' => ['required', 'email', 'unique:admins,email,'.$this->id.',id']
こうすることで、第3パラメータのidとadminsテーブルのidカラムが一致するレコードはルール対象外とする。
つまり、新規登録時は第3パラメータがnullになるようにしてルール対象外はなしとし、更新時は更新対象レコードのidが第3パラメータになるようにして更新可能にする。
全体ソース
AdminRequest.php
<?php
namespace App\Http\Requests\Admin;
class AdminRequest extends Request
{
private $id;
public function authorize()
{
return true;
}
public function all($keys = null)
{
$results = parent::all($keys);
$this->id = $results['id'];
return $results;
}
public function rules()
{
return [
'email' => ['required', 'email', 'unique:admins,email,'.$this->id.',id'],
];
}
}
第3パラメータに更新対象のidを指定しないといけないため、編集ページのview(xxx.blade.php)からコントローラにidをpostするようにしておく。
postされた値は、$results = parent::all($keys);後、$resultsに入っているので$this->id = $results[‘id’];をしてプライベート変数に格納しておく。
そのプライベート変数に格納したidをuniqueの第3パラメータにセットすることによりそのレコードを重複チェック対象外にする。