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







