CakePHPでsaveメソッドに失敗したときに確認するべきこと
はじめに
CakePHPでデータをデータベースに保存するのは、とても簡単です。
基本的には以下の流れとなります。
1. エンティティを作成
コントローラー内に下記の通り記述します。
Controller$newEntity = $this->モデル->newEntity();
2. データを加工
空のエンティティに対して、データを追加します。
Controller// フォームの入力値を使う $entity = $this->モデル->patchEntity($newEntity, $this->request->getData()); // エンティティの値を指定する $entity->name_en = $this->request->getData('name_en') ?? '';
3. save
Controller$this->ShareTypes->save($entity);
しかし、上記の流れに失敗することがあります。
今回は、失敗した際にどこをどう確認すべきかについてお伝えします。
結論
下記の2点を確認してください。
- 確認事項1.
$_accessible
にカラムを指定しているか? - 確認事項2. キャッシュが残っていないか?
順に見ていきましょう。
確認事項1. $_accessible にカラムを指定しているか?
エンティティファイルの $_accessible
配列に、カラム名を指定しているかを確認しましょう。
https://book.cakephp.org/3/ja/orm/entities.html#mass-assignment
$_accessible
は、デフォルトでは false になっているので、値を指定してやる必要があります。
Modelprotected $_accessible = [ 'カラム名' => true, ];
確認事項2. キャッシュが残っていないか?
ここがハマりやすいポイントとなります。 (私も数時間ハマりました……)
モデルの情報は、プログラム内部でキャッシュされています。
テーブルに変更があった際などは、必ずキャッシュをクリアしてやる必要があります。
キャッシュデータは、以下に保存されています。
app/tmp/cache/models
例えば以下のようなファイルです。
/app/tmp/cache/models/myapp_cake_model_default_users
キャッシュはディレクトリごと消しても問題ないので、一度すべて削除してしまうと良いと思います。
終わりに
今回は、CakePHPでsaveメソッドに失敗したときに確認するべきことについてお伝えしました。
参考になれば幸いです!
それでは。