もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

CakephpのbuildRules:existsInの条件を緩和する

はじめに

こんばんは。

今回は今の案件で少しハマったことを記録しておきます。

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;
    }

終わりに

今週は仕事忙しすぎて、勉強できてないですが、来週からは少し楽になるので、溜まってる本読んでいこうと思います!