よしcakephp4系を個人開発に使ってみようと思った矢先。
Modelを書こうとしたら公式cookbookにこんな文章が
CakePHP のモデルは
Table
とEntity
オブジェクトで構成されています。
ん?モデルって1個じゃないの?と思って少し調べていくとどうやら2系から3 系になるときにモデル周りが大きく変わったぽい。
このとき気づいてしまった。そうか、僕2系しか触ってないからおいてかれてたんだなと。
はじめてphp触る現場がcakephp2系でようやくなれてきたから最新バージョンに触れようと思ってしょっぱなで衝撃でした。
まぁ勉強するいい機会だと思って現在使ってる2系と比較しながらこのあたりについて思考整理。
【この記事でわかること】
cakephp3.X以降の新ORM
ORMを理解しとこう
以下はcookbookより。
CakePHP 3.0 は、ゼロから書き直された新しい ORM を提供しています。
簡単に言うと1.X、2.Xから3系になったとたんに新しいORMとやらになるわけです。
ORMとは「データと処理のまとまり」です。
つまり3系からはデータと処理のまとまりが1系と2系から大きく変わってくるのです。
あるデータがあったとき、そのデータに対する処理の方法も大体決まっている、という考えると、わりと自然な概念かなとか思います。
で、この最も単純な概念からすると、まさにデータの塊であるデータベースを、オブジェクトを使って処理したいという欲望が出てくるのは、自然なことだと思います。
しかし、テーブルデータは単純な連想配列みたいなものなので、オブジェクトとして使うには自前でオブジェクト化するための仕組みを作らなければならなかったのですが、そういう知見が溜まってきて、一般化したのがORMです。引用元:もっとORMを使えるようになりたいので、見直してみた
cakephp4.Xの新ORMで重要な3つのクラス
Table オブジェクト
Table オブジェクトは、データへのゲートウェイです。 彼らは、以前のリリースで
Model
が行っていた多くのタスクを処理します。 Table クラスは次のようなタスクを処理します。
- クエリーの作成。
- Finder の提供。
- エンティティーのバリデーションと保存。
- エンティティーの削除。
- アソシエーションの定義とアクセス。
- コールバックイベントのトリガー。
- ビヘイビアーとの相互作用。
テーブルオブジェクト の章では、 このガイドよりも、Table オブジェクトを使用する 方法についてはるかに多くの詳細を提供します。一般的に既存のモデルコードを移行する場合、 Table オブジェクトになります。Table オブジェクトは、特定のプラットフォームに依存する SQL は含まれていません。その代わりに、エンティティーやクエリービルダーと連携して動作します。 さらに、Table オブジェクトは、発行されたイベントを通じてビヘイビアーやその他の関連処理と 相互に作用します。
Query オブジェクト
あなた自身で構築するクラスはありませんが、あなたのアプリケーションコードは、新しい ORM の 中心である クエリービルダー を広範に使うことになります。 クエリービルダーは、
HAVING
、UNION
、およびサブクエリーのように、以前の CakePHP では非常に困難であったものを含む、単純または複雑なクエリーを構築することが容易になります。あなたのアプリケーションの既存の様々な find() 呼び出しは、新しいクエリービルダーを使用するように 更新する必要があります。Query オブジェクトは、自分自身でクエリーを実行せずにクエリーを 作成するためのデータを収容するための責任を負います。出力として
ResultSet
を 作成するために実行されるプラットフォーム固有の SQL を生成するために、Connection (接続) や Dialect (方言) と連携します。Entity オブジェクト
CakePHP の以前のバージョンの
Model
クラスは、任意のロジックや動作が含まれていない 単なる配列を返しました。コミュニティー内では CakeEntity のようなプロジェクトで欠点を補うことは できましたが、多くの場合、結果を配列で返すことは、多くの開発者のトラブルの原因となる欠点でした。 CakePHP 3.0 の場合、あなたが明示的にその機能を無効にしない限り、 ORM は常にオブジェクトの 結果セットを返します。 エンティティー の章はあなたのエンティティーで実行できる 様々なタスクをカバーしています。エンティティーは、次のいずれかの方法で作成されます。データベースからデータのロード、 またはリクエストデータからエンティティーへの変換のいずれかです。 エンティティーを一度作成すると、それらに含まれるデータを操作したり、Table オブジェクトと 連携して、それらのデータを永続化することを可能にします。
引用元:https://book.cakephp.org/3/ja/appendices/orm-migration.html