CakePHP4のデータベース規約を掘り下げてみる

CakePHP4のデータベース規約を掘り下げてみる

CakePHPには伝統のような命名規則があります。
CakePHP4もそうですし、前バージョンのCakePHP3もCakePHP2にも同様に命名規則が存在します。
必ず守らないとならないというものではないのですが、命名規則に準じた方がCakePHPの恩恵を受けられるケースが圧倒的に高いです。

今回はその命名規則の中から、データベースに関しての規約を掘り下げてみます。

テーブルの命名規則

CakePHP4で使用するテーブル名は、原則として英字小文字のアンダースコア区切りの複数形になります。
ここで言うテーブルとは、MySQLで言うとスキーマに存在しているテーブル名を指しています。
例えばユーザテーブルとか会社マスタテーブルとかそういうものです。

CakePHP4のテーブル名は原則として英字小文字のアンダースコア区切り複数形で作成

例えばユーザテーブルであれば「users」になりますし、会社マスタであれば「companies」になります。
ユーザ詳細テーブルなんてのを作成するのであれば「user_details」という具合です。
中学生の頃、今だと小学生かもしれませんが、やったであろう英語のお話しです。
ここの複数形は英語に準じた形になります。

ですので、いわゆる単複同型の場合は複数形にはなりません。
例を挙げると「news」とか「information」とかそういうものです。
英語覚えてないよ!という方はグーグル先生にお聞きするといいかと思います。

当然ながら、英語に準じた形ですので単純に「s」がつくのではなく「es」がつく場合もあります。
例えば「touch」は「touches」ですし、「search」は「searches」です。

この辺もグーグル先生がきっと教えてくれます。

中間テーブルの命名規則

前述の通り、複数形やらアンダースコア区切りやらでテーブルの命名規則が解決すればよかったのですが、もうひとつルールがあります。それが中間テーブルです。

中間テーブルとは、異なるテーブル同士のプライマリキーを使用して双方のテーブルに対して多対多のリレーションを張るためのテーブルを指します。
言い換えればbelongsToManyというものですが、その場合のテーブル名は以下のようになります。

中間テーブルは双方のテーブル名複数形をアンダースコア区切りのアルファベット順で作成

belongsToManyの説明の時によく使われるのが記事とタグの関係なんですが、記事を「articles」テーブルとしてタグの方は「tags」テーブルにしておきます。

このような場合、中間テーブルとしてのテーブル名は「articles_tags」テーブルになります。
双方のテーブル名がアンダースコア区切りでアルファベット順に並んでいるのがわかるかと思います。
中間テーブルの詳しい説明はまた別の記事で書いてみようかと思います。

カラムの命名規則

ではテーブルに定義するカラム名ですが、こちらは英字小文字のアンダースコア区切りになります。
アンダースコアで区切る単位は単語単位なのですが、こちらもテーブル名同様に原則としてです。

CakePHP4のカラム名は原則として英字小文字のアンダースコア区切りで作成

単語単位と書きましたが、これも英語に準じた形を指しています。
テーブル名の規約と違い、カラム名は複数形にする必要はありません。

ユーザの性別カラムを作りたければ「gender」になるかもしれませんし、少々冗長ですが会社名というカラムを作るのであれば「company_name」のようになるだろうと思います。

リレーションを張る場合のカラム命名規則

カラムの命名規則にはもうひとつ重要な点があります。
それが他テーブルとのリレーションで使用するカラムの命名規則です。要は外部キーです。
hasOneとかhasManyとか、苦手な人が割といるアレの話です。

リレーションで使用するカラムは対象テーブル単数形に_idをサフィックスとしてつける

サラっと説明します。
ユーザテーブルと会社マスタテーブルがあったと仮定します。それぞれusersとcompaniesとしましょう。
ユーザは「必ずどこか1つの会社に所属している」という前提にします。

データの持ち方は色々ありますが、今回は一番簡単そうなユーザテーブルでこの前提を実装します。
その時、usersテーブルはcompaniesテーブルに対してbelongsToの関係になります。
companiesテーブルから見たusersテーブルはhasManyの関係です。
雑に説明するとbelongsToは「参照してます!」でhasManyは「色んなデータで参照されます!」です。

こういう場合、usersテーブルに「company_id」というカラムを定義するということになります。
これだけだとよく意味がわからないかもしれませんが、Modelをbakeする時にCakePHPの方でusersテーブルとcompaniesテーブルのリレーションを自動的に設定してくれます。賢いのです。
これが冒頭で書いた「CakePHPの恩恵」の話です。

リレーション対象カラムの命名規則を無視した場合

逆に。
リレーション不要なのに「xxxx_id」というカラムを定義した場合、上記同様にModelをbakeする時にCakePHPの方で「xxxxxってテーブルあるんでしょ!わたし、リレーション張っておくね!」と余計なことをしてくれやがります。そこまで賢くないのです。

よくあるのが「ログインID」というカラムを追加する時に「login_id」とカラムを定義する。
bakeしたら「loginsテーブルとのリレーションが張られている」というような状況です。
他にも「データ作成者ID」として「created_user_id」なんてカラムを定義する。
bakeしたら「created_usersテーブルとのリレーションが張られている」とか。
そんなテーブルないよ!というのはわかりますが、CakePHPはそこまで賢くないのです(2回目)

こういう話を知っておくとlogin_idじゃなくてlogin_codeにしようとか、created_user_idなんてカラム名じゃなくてcreated_byにしようとか、そういう勘が働くようになります。

まとめ

データベース規約と書きましたが、CakePHP4には色んな規約があります。
それこそが「設定より規約」と謳っているCakePHPの真骨頂なのかもしれません。

ただ、冒頭に書いたように必ずしも守らなければいけないということではありません。
プロジェクトによっては規約外の書き方をしなくてはならない場合もあるでしょうし、リプレース案件とかだと多そうですよね。
その辺は臨機応変に対応すればいいかと思います。

以上がCakePHP4のデータベース規約の説明になります。
お疲れ様でした。

CakePHP4カテゴリの最新記事