Cake2でバリデーションのユニークを判定する isUnique()
は rule に指定すればユニークであるか否かを実施してくれていました。
ですが、Cake4では isUnique()
自体はルールチェッカーで付属されているので、用途によって使い分ける必要あります。
単純なものならルールチェッカーで実装すればよいでしょう。複雑な検索結果でユニーク判定できるものはファインダーを利用する手もあります。
まずは、バリデート時に動的ファインダーを利用してユニーク検証をする方法です。
Cake2: isUnique バリデート
public $validate = [ 'email' => [ 'notBlank' => ['rule' => ['notBlank'], 'message' => '入力してください'], 'isUnique' => ['rule' => ['isUnique'], 'message' => 'すでに存在しています'], ], ];
Cake2では バリデーションに isUnique
が存在していたので、上記の様に指定すればOKでした。
Cake4: 動的ファインダーを利用してユニーク判定をする
$validator->add('email', 'isUniqueEmail', [ 'rule' => function ($value, $context) { return !$this->findByEmail($value)->count(); }, 'message' => ' すでに存在しています ', ]);
上記では動的ファインダーを利用して email カラムの ユニーク判定をしてみました。
次はビルドルールとして、ルールチェッカーを利用してます。
Cake4: ルールチェッカーを用いてユニーク判定させる
use Cake\ORM\RulesChecker; /** * ビルドルール * * @param \Cake\ORM\RulesChecker $rules ルールチェッカー * @return \Cake\ORM\RulesChecker */ public function buildRules(RulesChecker $rules): RulesChecker { $rules->add($rules->isUnique(['email'], 'すでに存在しています')); return $rules; }
基本的にはビルドルールを適用しておくと、Cakephp準拠的な感じがするのでベターかもしれませんね。