LoginSignup
27
25

More than 5 years have passed since last update.

CakePHPのテーブル名「単語の複数形」について

Last updated at Posted at 2014-03-26

お初です。

CakePHPのブログチュートリアルで

PHPフレームワークに興味があり、CakePHPをちょっと触ってます。(CakePHP 2.4.6 安定版)
日本人ユーザが多いこともあり日本語の解説ページがなかなか充実していていいですね。
ひとまず親切なブログチュートリアルがあったので、簡単なブログを作成しました。

ブログ自体はスイスイ作れたのですが、一箇所、どうにもモヤモヤしている箇所がありました。
Modelクラスを作成したときに連携されるデータベースのテーブル名です。

テーブル名は「複数形」なのだが…

ブログチュートリアルでは真っ先に"Postモデル"を作るように指示しており、その際に

命名規約は、CakePHPでは非常に大切です。 モデルをPostという名前にすることで、CakePHPは自動的に、このモデルはPostsControllerで使用されるのだろう、と考えます。 また、 posts という名前のデータベーステーブルと結びつけられます。

と述べています。「考えます。」ってなんだよと思いつつ…。

へー。ふーん。じゃあその命名規約ってどうなってるのっと。

モデルのクラス名は単数形でキャメル記法です。 Person、BigPerson、ReallyBigPerson などは規約に合ったモデル名です。

CakePHP のモデルに対応するテーブル名は、複数形でアンダースコア記法です。 上記の例で言えば、テーブル名はそれぞれ、 people 、 big_people 、 really_big_people になります。

ユーティリティライブラリの Inflector を使って、単語の単数形・複数形を判定することができます。 より詳しい情報は、 Inflector を読んでください。

へー、テーブル名は複数形なんだ。だからPostモデルを作ると、postsテーブルと連携するんだね。

そこで自分は思いました。果たしてどれだけの人が正しく複数形を認識できているのだろうかと。
例えば"data"は実は"datum"の複数形である、とか。(datumなんて日頃見ませんけど)

そこで単数形・複数形を判定しているInflector.phpを覗いてみました。
e619c1bdbb2d66342343c305d98ba538.png

なるほど。正規表現でちゃんと面倒見てますね。

英単語を正しく知っていないとダメ

Child(子供)の複数形がchildrenであることは義務教育を受けていれば知っている人も多いかと思いますが、
- Knife(ナイフ)の複数形はknives (knifesではない)
- Apex(頂点)の複数形はapexes (Apexsではない)
などなど、英単語には「変化するもの」が存在します。

CakePHPではInflector.phpでしっかり「正しい複数形」に変換をかけた上で、それをテーブル名として指定しているのですね。

結論:テーブル名は正しい複数形の綴りなのか、注意しましょう。
自動でCakePHPにテーブル名指定をやってもらってる方は要注意ですね。

もちろん、テーブル名は好きに決めることもできる

「複数形がわからないとダメなんだぁ…終わった…」なんて不便なことはないです。
例えばScience.phpというModelクラスを作ったとして、その内で

  var $useTable = 'nitroglycerin';
  // $useTableがミソ

を書けば、任意のテーブル名(上の例では'nitroglycerin'テーブル)にアクセスできるようになります。

ここはModel.php内の729行目当たりを見るとお分かりかと思います。

おしまい

27
25
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
27
25