読者です 読者をやめる 読者になる 読者になる

やったこと

webサービスを作るときに考えたことを垂れ流します

【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」とは外部テーブルにその値を持つレコードがあるか確認してくれるチェックだったんですね・・こんな基本的なことも知りませんでした・・。