0
2

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.

CakePHPのアクセサ/ミューテータの仕様にLaravel常用者がハマった話

Last updated at Posted at 2017-01-07

普段Laravelを使っていて、CakePHPでデータベースにエンティティを通して値を保存するというシーンでハマったのでそれぞれのフレームワークの仕様の違いを紹介します。

CakePHPにおけるアクセサ/ミューテータの仕様

Cake/ORM/Table::_processSave()
    => Cake/ORM/Entity::extract()
        => Cake/Datasource/EntityTrait::extract()
        => Cake/Datasource/EntityTrait::get()

Cakephp3でCake/ORM/Table::save()を呼ぶと_processSave()メソッドが呼ばれますが、この中でエンティティのプロパティをSQL文にバインドする時に、エンティティクラス内にユーザー定義のアクセサがある場合、それによって値がフォーマットされます。
CakePHPではアクセサとミューテーターは、オブジェクト指向でいうアクセサやミューテータそのもので、エンティティのプロパティの参照時にアクセサが呼ばれ、束縛時にミューテータが呼ばれる仕様です。

Laravelにおけるアクセサ/ミューテータの仕様

Laravelでは、モデルの"データベースから取ってきたプロパティ"の参照時にアクセサが呼ばれ、モデルのプロパティをデータベースに保存する際ミューテータが呼ばれるという仕様です。

すなわちデータベースに値を出し入れする際に、CakePHPとLaravelのアクセサとミューテータは互いに正反対の動作をするということです。

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?