はじめに
こんばんは。
今回は今の案件で少しハマったことを記録しておきます。
CakephpのbuildRulesでexistsInがあるとおもいます。
FOREIGN KEYを貼っているか、決められた命名でカラム名を作ると、bakeしたときに対象先のテーブルにデータがあることを調べてくれるルールを作ってくれます。
便利なのは、FOREIGN KEY貼ってないような、tableの成約が緩めのテーブルに関しても、そのルールを書くことで不正データの混入を阻止してくれます。
ただ、 基本的には管理者テーブルのIDが入るんだけど、0の場合は、バッチが追加したデータとして追加したいんだよね〜
みたいなことがよくあります。
そのさい、 existsInのルールを外してしまうと、関連データ以外もどんどん入ってしまいます。
0または、対象先テーブルのIDの値しか許可しない
というようなルールをかければ一番です。
やり方調べてみるとやっぱりありました。
やってみた
<?php /** * 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): \Cake\ORM\RulesChecker { $rules->add(static function (Summary $entity, array $options) { $rule = new ExistsIn(['admin_id'], 'AdminUsers'); return $entity->admin_id === 0 || $rule($entity, $options); }, '_existsInOrZero', ['errorField' => 'admin_id', 'message' => '0を設定するか、存在するadmin_idを入力してください']); return $rules; }
終わりに
今週は仕事忙しすぎて、勉強できてないですが、来週からは少し楽になるので、溜まってる本読んでいこうと思います!