CakePHP3のEntityのaccessibleでハマった話
CakePHP3にはEntityに$_accessible
プロパティというものがあります。
http://book.cakephp.org/3.0/ja/orm/entities.html#mass-assignment
↓Bakeするとよく見るコレです。
protected $_accessible = [
'id' => false,
'*' => true,
];
この状態だとidは変更不可、それ以外は変更可ということになり、Save時のEntityのプロパティに値をセットしたとしても保存されません。
これを利用して、今回ある項目はinputフォームにはreadonlyを付けてPOSTされるけど保存されない、というような実装を行いました。
という前提を元に今回ハマった点について話します。
ハマった問題
リレーションを貼った先のEntityに想定したaccessible設定しているのに保存されない!
構成
テーブル関係
企業情報テーブルとそれに紐づく口座情報を格納する2つのテーブルがあり、hasmanyでリレーションが貼られています。
コード
企業情報は全て編集不可であるため全ての項目をfalseにしています。
class Company extends Entity
{
protected $_accessible = [
'*' => false,
];
}
口座情報は全て編集可であるため全ての項目をid以外trueにしています。
class Bank extends Entity
{
protected $_accessible = [
'*' => true,
'id' => false,
];
}
画面
同画面で企業と口座情報を同時に編集している。
結論
こう書かないといけなかった
class Company extends Entity
{
protected $_accessible = [
'*' => false,
'bank' => true, <-リレーション先をココに書く
];
}
どういうことか
POSTされるデータ構造でaccessible指定をしないといけないということでした。
リレーション構造をみて、CakePHPが良きに計らってくれるようなことはありません。
まとめ
accessibleをうまく使うことでsave時のプロパティから削除するような記述が不要になるかと思います。
Entityを見れば、保存されるのか、されないのか、が一発で分かるかと思うので使ってみると良いかもです。
※guradオプションをfalseにした場合はこの限りではないですが...
http://book.cakephp.org/3.0/ja/orm/entities.html#id9