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

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

バージョン
CakePHP3.x

前知識

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

なお、複数ワードであらわされる場合は、
UserInfo
UserInfos
user_infos

といった感じで、大文字ベースの場合はワードの先頭を大文字で、小文字ベースの場合はハイフンでつなぎます。

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

テーブル名

スネークケース
小文字複数形で記載します。(中間テーブルの場合は後述を参照)

例 user_profiles

コントローラー

アッパーキャメルケース/パスカルケース
/src/Controller/大文字複数形Controller.php

クラス名
class 大文字複数形Controller extends AppController

例 UsersController.php

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

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

アクション名

ローワーキャメルケース
先頭ワードが小文字で2ワード目以降がある場合は、先頭が大文字になります。

例 getUserInfo

テーブル

アッパーキャメルの複数形
/src/Model/Table/大文字複数形Table.php
クラス名
class 大文字複数形Table extends Table

例 UsersTable.php

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

 

エンティティ―

アッパーキャメルの単数形
/src/Model/Entity/大文字単数形.php
クラス名
class 大文字単数形Table extends Table と定義

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

例 User.php

belognsToManyの注意点

2ワードからなるモデル名の場合、注意が必要です。
UserProfiles と UsersProfiles は意味が違います。
UserProfilesは単体のモデルですが(普通はhasOneとかbelongs?)
UsersProfilesはUsersモデルととProfilesモデルの中間テーブル(belongsToMany)という意味になります。

一応、単語はアルファベット順に並べるというルールもあるらしい(例ProfilesUsers)のですが、順番は気にしなくても動くようです。

Modelからの検索結果

contain()メソッドなどでアソシエーションを指定する場合は、アッパーキャメルの複数形で書きます。

例 UserProfiles

モデルからfindした際の検索結果について
ネストさせたモデルは基本的にはスネークケースのプロパティー名でアクセスしますが
hasOne/belongs は単数形
hasMany/belongsToMany は複数形
になります。

テンプレート

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

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

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

 

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

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

こんなの正直覚えきれないので、テーブル設計周りだけ覚えて、基本はbakeで吐かせて作ってもらうのが吉。後か何か追加したい場合は…まぁ頑張りましょう。

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

タイトルとURLをコピーしました