複数カラムのユニーク制約バリデーション
単一カラムのユニーク制約バリデーション
複数カラムのユニーク制約バリデーション 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
スポンサーリンク





