バグ解消法、お役立ち情報など

CakePHPでsaveメソッドに失敗したときに確認するべきこと

logo

はじめに

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 になっているので、値を指定してやる必要があります。

Model
protected $_accessible = [ 'カラム名' => true, ];

確認事項2. キャッシュが残っていないか?

ここがハマりやすいポイントとなります。 (私も数時間ハマりました……)

モデルの情報は、プログラム内部でキャッシュされています。

テーブルに変更があった際などは、必ずキャッシュをクリアしてやる必要があります。

キャッシュデータは、以下に保存されています。

app/tmp/cache/models

例えば以下のようなファイルです。

/app/tmp/cache/models/myapp_cake_model_default_users

キャッシュはディレクトリごと消しても問題ないので、一度すべて削除してしまうと良いと思います。

終わりに

今回は、CakePHPでsaveメソッドに失敗したときに確認するべきことについてお伝えしました。

参考になれば幸いです!

それでは。

バグ解消法、お役立ち情報など