20
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP3のEntityのaccessibleでハマった話

Last updated at Posted at 2016-06-06

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でリレーションが貼られています。

01.PNG

コード

企業情報は全て編集不可であるため全ての項目を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

20
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?