複数カラムのユニーク制約バリデーション

単一カラムのユニーク制約バリデーション
複数カラムのユニーク制約バリデーション 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' => 'すでに存在しています',
]);

関連記事

スポンサーリンク

PHPをコマンドラインから使用する方法

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る