質問: CAKEPHP3の参考書に従ってbakeコマンドで一連を作成しました。DBをMySQLとしたテーブルの登録画面は無事に操作することができました。 当該テーブルのid列がPrimaryキーで自動採取するタイプでしたが、MySQLだった際は無事にキーを自動採取した上でレコードが登録できていた、ということです。 app.phpをMSSQLと接続するための定義に変更して(勿論同じ構造のテーブルを用意した上で)、bakeで一連を仕上げなおしました。レコードの照会・編集・削除・一覧表示のメソッドは無事動作しますが、登録のメソッドだけ正常に行えません。 CakePHP内蔵サーバに現れていたエラー内容を確認すると、id列がemptyという状況のようでした。 標題のとおりの要因=キーの自動採取に失敗していると推察しています。 ![画像の説明をここに入力](https://i.stack.imgur.com/OeF6m.png) この状況を打開する手立てはあるのでしょうか?仕上げられたエンティティ内の$_accessibleを編集('id'=>true から 'id'=>false )にしても状況は変わりありませんでした。 ちなみに、MSSQL上の当該テーブルに別の手続き(ManagementStudio)でレコードを登録すると、自動でidが取得されており、DBMS側の問題ではないと受けてとれます。 参考書の中で紹介されたDBMSとは異なるDBMSを選択して、参考書に従った課題の取り組みは無理がありますかね(より実践を意識したくて DBMSにMSSQLを選択しています) ``` public function validationDefault(Validator $validator) { $validator ->integer('id') ->requirePresence('id', 'create') ->notEmpty('id'); $validator ->scalar('title') ->maxLength('title', 50) ->allowEmpty('title'); $validator ->scalar('author') ->maxLength('author', 50) ->allowEmpty('author'); $validator ->integer('price') ->allowEmpty('price'); return $validator; } ```
回答: idフィールドのバリデーションが以下のように設定されているためバリデーションエラーとなり保存できない状況です。 ``` $validator ->integer('id') // idは数値 ->requirePresence('id', 'create') // 新規作成時にidは必須 ->notEmpty('id'); // idは空であってはならない ``` idが採番されるのはDBへの保存時ですので、保存前には空でなければなりません。 idのバリデーションは以下のようになるべきです。 ``` $validator ->integer('id') // idは数値 ->allowEmpty('id', 'create'); // 新規作成時にidは空でもよい ```