複数カラムのユニーク制約バリデーション
単一カラムのユニーク制約バリデーション
複数カラムのユニーク制約バリデーション Validator
複数カラムのユニーク制約バリデーション RulesChecker
Validatorのルールで無名関数やカスタムバリデーションを使う方法
[参考記事] 標準のValidatorを拡張してカスタマイズする方法
[参考記事] 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
単一カラムのユニーク制約バリデーション
1つのカラムのユニーク制約バリデーションはbakeコマンドで自動生成できます。
bakeコマンド
bin/cake bake model 【モデル名】
ユニーク制約バリデーション部分はTable.phpに記述されます。
src/Model/Table/【モデル名】Table.php
該当部分は下記になります。
複数カラムのユニーク制約バリデーションはbakeコマンドでは自動生成されません。
/** * Default validation rules. * * @param \Cake\Validation\Validator $validator Validator instance. * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator): Validator { $validator ->add('name', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); return $validator; } /** * Returns a rules checker object that will be used for validating * application integrity. * * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. * @return \Cake\ORM\RulesChecker */ public function buildRules(RulesChecker $rules): RulesChecker { $rules->add($rules->isUnique(['name']), ['errorField' => 'name']); return $rules; }
複数カラムのユニーク制約バリデーション Validator
複数カラムはscopeを指定します。
$validator ->add('name', 'unique', [ 'rule' => ['validateUnique', ['scope' => 'email']], 'provider' => 'table', ]);
scopeに配列を渡して複数を指定することもできます。
$validator ->add('name', 'unique', [ 'rule' => ['validateUnique', ['scope' => ['email', 'address']]], 'provider' => 'table', ]);
エラーメッセージはmessageで渡します。
$validator ->add('name', 'unique', [ 'rule' => ['validateUnique', ['scope' => 'email']], 'provider' => 'table', 'message' => __('既に存在している{0}です。', __('Name')), ]);
複数カラムのユニーク制約バリデーション RulesChecker
isUniqueに複数カラムを配列で渡すと複数カラムのユニーク制約バリデーションができます。
errorFieldを指定しなかった場合はisUniqueの配列の最初のフィールドになります。
$rules->add($rules->isUnique(['name', 'email']), ['errorField' => 'name']);
エラーメッセージの指定方法はいくつかあります。
messageで渡す方法
$rules->add($rules->isUnique(['name', 'email']), [ 'errorField' => 'name', 'message' => __('既に存在している{0}です。', __('Name')), ]);
isUniqueの第2引数に渡す方法
$rules->isUnique(['name', 'email'], __('既に存在している{0}です。', __('Name')))
Validatorのルールで無名関数やカスタムバリデーションを使う方法
編集の場合は自レコードを除外するのを忘れないようにしましょう。
$validator->add('name', 'isUnique', [ 'rule' => function ($value, $context) { $data = [ 'name' => $context['data']['name'], 'email' => $context['data']['email'], ]; // 編集の場合は自レコードを除外する if (!empty($context['data']['id'])) { $data['id !='] = $context['data']['id']; } return $this->find()->where($data)->count() == 0; }, 'message' => 'すでに存在しています', ]);
関連記事
- 標準のValidatorを拡張してカスタマイズする方法
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法 CakePHP2
- 国際化i18n(多言語化)
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP5系の入手方法・インストール方法
- CakePHP4系の入手方法・インストール方法
- CakePHP3系の入手方法・インストール方法
- CakePHP2系の入手方法・インストール方法
- CakePHP1系(CakePHP1.3)をPHP7・PHP8以降に対応させる方法
- CakePHP1系(CakePHP1.3)の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- CakePHPのバージョンごとのシステム要件
- 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
- PHP Strict Standards: Non-static method と出る場合の対処法
- CakePHPでカラムを比較してSELECTする方法
- [CakePHPのバグ]キャッシュ処理でunlinkエラーが発生する
- 『id』以外のプライマリキーのカラム名を使用する方法
- [CakePHPのバグ]キャッシュ処理でunserializeエラーが発生する
- プライマリキーIDを連番数字ではなく推測しにくい文字列にする方法
- 複数のデータベースを切り替える方法(別データベースを使用する)
- MySQLで文字化けを防ぐ方法
- action名にlistは使えない listを使う方法
- ログイン認証処理をする方法
- CakePHP、Symfony、Zend Frameworkの比較
- CakePHPのDB接続情報設定
- ファイル読み込みPATHを設定
- デバッグレベルを設定
- セキュリティレベルの設定
- キャッシュを有効にする
- CakePHPのエラーテンプレートの一覧
- データベーステーブルを参照しないページを作る
- TOPページはIndexControllerではない Cannot redeclare config()
- ディレクトリ構成
- CakePHP
スポンサーリンク