[CakePHP3]Modelがモデル名?テーブル名?単数形?複数形?

スポンサーリンク
CakePHP

CakePHP3でModelの指定方法や、find()して帰ってくるデータのフォーマットがCakePHP3依然と大きく変わりました。
めちゃくちゃ混乱します。
ちょっとまとめました。

バージョン
CakePHP3.x

前知識

モデルをUserだとすると。
モデル名単数形はUser   <-大文字単数形
モデル名複数形はUsers <-大文字複数形
テーブル名はusers という感じで、全部小文字で複数形になります。

なお、複数ワードであらわされる場合は、
UsersInfo
UsersInfos
users_infos
といった感じで、大文字ベースの場合はワードの先頭を大文字で、小文字ベースの場合はハイフンでつなぎます。

ということで、ワードの先頭が大文字になるか?全部小文字か、複数形か?単数形かの4パターンがあるわけですが、それぞれの場合でどうなるか

スポンサーリンク

テーブル名

小文字複数形で記載します。

コントローラー

/src/Controller/大文字複数形Controller.php
クラス名
class 大文字複数形Controller extends AppController

コントローラ内でモデルの指定やアソシエーションの指定(associatedとかcontainとか)は基本的に大文字複数形で書きます。
find()で帰ってきたデータに関しては、基本的に小文字ベースになります。
また、アソシエーション先の項目名に関してですがリレーションの方法によって複数形の場合と単数形の場合があり、具体的には
hasOne,belongsToは小文字単数形に、hasMany,belongsToManyは小文字複数形になります

リダイレクトなどで、コントローラー名を書く場合は、大文字小文字どちらでもいいようですが、複数形になります。
ただし、小文字ベースで書く場合でコントローラー名が複数ワードの場合、ワードの間はハイフンでつなぐ必要があるようです。
ややこしいので、リンク系は大文字複数形で統一したほうがいいと思います。
ex. user-infos

 

テーブル

/src/Model/Table/大文字複数形Table.php
クラス名
class 大文字複数形Table extends Table

$_accessibleでアクセス権を指定する場合は全部小文字ベース。
アソシエーションはbelogsTo系は単数、hasMany系は複数形で書きます

 

エンティティ―

/src/Model/Entity/大文字単数形.php
クラス名
class 大文字単数形Table extends Table と定義

アソシエーションはすべて大文字複数形で記載します。(アソシエーションの種類に関係なく複数形です!)

 

テンプレート

/src/Template/大文字複数形/

リンク先などのコントローラー名は大文字でも小文字でもOKだが複数形で書きます。※コントトーラー名に合わせる、大文字複数形で書いたほうが間違いが少ないかと思う

Formでクラス名を指定する場合は小文字ベースでアソシエーションの種類により単数形、複数形で書くようです。
とりあえず、わかんなくなったらfind()で引っ張ってきたときと同じ形になるように書いてあげればOKです。

 

単数形とか複数形とか、ぶっちゃけいらなくね?

と、大体こんな感じです。。。。
CakePHP2とまた微妙に違うのも混乱ポイント。

正直覚えきれないので、基本はbakeで吐かせて作ってもらうのが吉。後か何か追加したい場合は…まぁ頑張りましょう。

なんでこんなややこしいことにしたのか理解に苦しみます。全部統一してくれればいいのに。
そもそも単数形とか複数形とか、ぶっちゃけいらない。カラム名を英語にするとは限らないし。英語圏の奴らは、非英語圏のことを全く分かってくれないんですよね…。困ったものです。