【CakePHP3】existsInチェックはレコードの存在を確認するチェックだよ!
CakePHP3に「existsIn」チェックってありますよね。
Modelでデータを変更するときに走るチェック処理です。テーブル設定ファイルの「buildRules」のとこに書いてありますよね。
私このチェックの意味を勘違いしていました。
これはテーブルの構造(フィールドの存在)をチェックするものだと思っていたのですが違ってました。これは「レコードが存在するか」をチェックするもののようです。
ちょっと実験したのですが、例えば以下のように「Options」テーブルの「post_id = 10」のレコードを「post_id = 11」にする処理を書くとします。
$this->Options = TableRegistry::get('Options'); $option = $this->Options->find()->where(['post_id' => 10])->first(); $option->post_id = 11; $ret = $this->Options->save($option);
そしてOptionsテーブルの「existsIn」チェックには下記のようなルールがあるとします。
public function buildRules(RulesChecker $rules) { $rules->add($rules->existsIn(['post_id'], 'Posts')); return $rules; }
このときsave実行のタイミングで、「Posts」テーブルに「post_id = 11」のレコードが存在するかチェックが走ります。
もし存在しなかったら「This value does not exist」というexistsInのエラーが発生します。
「existsIn」とは外部テーブルにその値を持つレコードがあるか確認してくれるチェックだったんですね・・こんな基本的なことも知りませんでした・・。