Larave バリデーション:複合絡むでユニーク+【Laravel】複数カラムのユニーク制約のバリデーションを実装する方法<自分自身を除外する(ignore)の記載方法もあるよ>

https://teratail.com/questions/99712
カスタムValidationでの複合カラムの方法

Request派生クラス内でのバリデーションの書き方であれば、こんな感じでしょうか。


public function rules() {
  return [
    'id' => 'required',
    'name' => 'required|unique:users,name,NULL,id,id,' . $this->input('id')
  ];
}

↑の方法から自分自身を除く方法をくわしく書いてあるサイト
https://qiita.com/katsunory/items/02693caf0e8c71d609ee





5.2までの記法なら1行でもかける
'unique:sample,second,' . $this->input('id'). ',id,first,' . $this->input('first'),
unique:テーブル,カラム,除外ID,IDカラム,where制約カラム,where制約カラムの値

もちろんイコール以外も否イコールとかIS NULLとかも書き方次第でいける。
それらの記法はこちらの記事が参考になる。
[Laravel]バリデーションのuniqueにおける条件指定について - Qiita

とりあえずidは一旦uniqueチェックせず、nameの方で「idが$this->input('id')、かつその中でnameがunique」というチェックをすればよいかと思います。
uniqueの引数を前から順に解説するならこんな感じの意味です。

引数 値
テーブル users
カラム name
除外対象 NULL
除外対象のwhere対象カラム id
絞込条件対象カラム id
絞込条件値

指定フィールドの名称を設定する方法
https://liginc.co.jp/359544

$this->validate($request, [
            'name'  => 'required|alpha',
            'level' => 'required|integer|between:1,99',
        ], [
            'level.required' => ':attributeは必須やねん',
            'level.integer'  => ':attributeは整数やねん',
            'level.between'  => ':attributeは:minから:maxまでやねん',
        ], [
            'level' => 'レべル',
        ]);

自分自身を(自身のIDを取得して)除外する方法
http://www.webopixel.net/php/1377.html

既存はこんな感じ

 public function rules()
    {
        $user = $this->user();

        return [
            'email' => [
                'required',
                'email',
                'confirmed',
                'max:255',
                Rule::unique('users')->ignore($user->id),
            ],
        ];
    }
}

【Laravel】複数カラムのユニーク制約のバリデーションを実装する方法<自分自身を除外する(ignore)の記載方法もあるよ>
https://qiita.com/katsunory/items/02693caf0e8c71d609ee

use Illuminate\Validation\Rule;

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    // firstカラムとsecondカラムのユニーク制約のバリデーション。どちらも必須とする
    return [
        'first'  => 'required',
        'second' => [
            'required',
            // Ruleクラスを使用した5.3からの記法。視覚的にわかりやすくなっている
            // sampleテーブルでユニーク制約。ignoreで入力されたidはバリデーションから除外する
            Rule::unique('sample')->ignore($this->input('id'))->where(function($query) {
                // 入力されたfirstの値と同じ値を持つレコードでのみ検証する
                $query->where('first', $this->input('first'));
            }),
        ],
        // 5.2までの記法。1行で書けるがあまり直感的ではない
        // 'second'  => 'required|unique:sample,second,' . $this->input('id'). ',id,first,' . $this->input('first'),
    ];
}
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク