CakePHP

CakePHP2.0のbakeでモデルの作成

更新日:

今日は、CakePHP2.0のbakeでモデルの作成方法を勉強してみたいと思います。まず最初にデータベースの作成ですが、一から作成するのは面倒ですので、以前作成したDVDコレクション用のデータベースを使用して作成してみたいと思います。データベースのエクスポート及びインポートの方法は、『MySQLデータベースの移行』をご覧下さい。

只、このままでは、CakePHPでは使えないので、CakePHPの命名規則に則り、いくつか修正します。まずテーブル名ですが、小文字で表示し、単語をアンダーバーで区切る必要があるみたいです。また、最後の単語は複数形にする必要もあるみたいですので、『DVD』→『dvd_collections』と変更しました。テーブルのカラム名の命名規則では、主キーは『id』に指定するとのことですので、『ID』→『id』に変更しました。レコード作成日時(created)とレコード修正日時(modified)が必要みたいですので、『DATE』→『created』に変更して、『modified』を新規挿入しました。あと、全てのカラム名も半角に変更しました。

私が最初、CakePHP導入に躊躇したのは、このデータベースのテーブル名やカラム名の命名規則が厳格すぎる点です。既存の膨大なテーブル数のデータベースをこの命名規則に則り変更するのはかなりの手間がかかりそうです。それとCakePHPの扱いやすさの両天秤だと思います。既存のプログラムを移行する場合、どちらを優先するかによると思います。

1) それでは、本題に入ります。今回も『bake』を利用して、モデルを作成してみたいと思います。コマンドプロンプトを起動したら、CakePHP2.0をインストール時に自動的に作成されている『app』フォルダに移動します。

2) 『cake bake』と入力すると、Bakeが起動します。ちなみに、CakePHP2.0.4の安定版がリリースされていたので、2.0.3から2.0.4にアップデートしています。

3) それでは、今回はモデルを作成したいので、『M』と入力して、Enterキーを押します。CakePHPで使用可能なデータベースが表示されます。数字を入力するか、別のモデル名を入力するように指示しています。途中で終了する場合は、『q』と入力するみたいです。先程作成したテーブル名は、『dvd_collections』ですが、選択可能なモデル名が『DvdCollection』に変更になっています。つまり、データベーステーブル名をCakePHPの命名規則通りに作成したら、CakePHPで命名規則に則って、モデルが作成されるということでしょうか。CakePHPの命名規則は複雑で、覚えるのは大変かなと思ったのですが、『Bake』で基本的なファイルやクラス名を作成してから、コードを書き換えるというような作業を行えば、ファイル名やクラス名の間違いが減ると思います。

4) 『1』と数字を入力して、Enterキーを押すと、モデル内にバリデーションを指定するのか訪ねてくるので、バリデーションの指定方法がどうなるのか知りたいので、そのままEnterキーを押します。

5) 『フィールド名がid、タイプがinteger(整数型)』と表示され、1から31までの数字とバリデーションルールがずらずらと表示された後、入力待ちになります。バリデーションルールは後日詳しく調べたいと思いますが、idはAUTO_INCREMENT(自動連番)で指定していますので、バリデーションルールを何も指示しない『31』のまま、Enterキーを押します。

6) 次は、『フィールド名:title、タイプ:string(文字列)』、バリデーションは『21』のnotempty(空ではない)が選択されていますので、これもそのままEnterキーを押します。

7) すると、別のバリデーションルールを追加しますかと尋ねてきますので、『n』のままEnterキーを押します。

8) 次は、『フィールド名:created、タイプ:datetime』ですので、『9』とかなと思ったのですが、選択が『31』になっています。基本的にcreatedやmodifiedはプログラム上で入力するはずですので、バリデーションルールは不要なのでしょう。そのままEnterキーを押します。

9) 最後の『フィールド名:content、タイプ:text』もバリデーションルールを適用しないで、そのままEnterキーを押します。

10) 次に、モデルのアソシエーションタイプを尋ねてきます。hasMany(複数の関連レコードを持つ:1対多)、hasOne(ひとつの関連レコードを持つ:1対1)、belongsTo(1つの親レコードの所属する:1対1)が、テーブルはまだ1つしか用意していませんので、今回は、『n』と入力します。

※CakePHPでは、2つのモデルを関連づけるための仕組みとして『アソシエーション』と呼ばれているものが用意されています。これは、テーブル間のつながりを扱うために用意されているもので、以下の4種類のアソシエーションが用意されています。

  • hasOne
    テーブルAの各レコードに対して、テーブルBのレコードが1つ対応している状態です(1対1対応)。テーブルAを検索すると、それぞれのレコードに対するテーブルBのレコードも併せて取り出されます。テーブルA側にテーブルBのIDを保管する外部キーを用意します。
  • hasMany
    テーブルAの各レコードに対して、テーブルBの複数のレコードが対応する状態(1対多対応)。テーブルAを検索すると、それぞれのレコードに応じたテーブルBの全てのレコードが配列として取り出されます。
  • belongsTo
    テーブルBがテーブルAに属している状態です。hasOneとにていますが、belongsToでは、テーブルB側に、対応するAのIDを保管する外部キーが用意さっれます。
  • hasAndBelongsToMany
    テーブルAの各レコードに対して、テーブルBの複数のレコードが対応しており、かつテーブルBの各レコードにもテーブルAの複数レコードが対応する状態(多対多対応)。これは、2つのテーブルの他に両者の関連を記述するための専用テーブルを作成し、そこに両者のテーブルの外部キーを用意します。

11) 今までの設定で良ければ、Enerキーを押します。下記の図では、『created』にバリデーションルールが指定されていますが、後で、実際にコードを変更しますので、このままEnterキーを押します。

12) 最後に、意味がいまいち不明ですが、PHPUnitがインストールされていません。bakeのテストユニットを導入しますかと尋ねているのでしょうか。間違えていたら済みません。とりあえずそのままEnterキーを押しますと、bakeの初期画面に戻りました。

13) それでは、作成されたモデル『DvdCollection.php』ファイルを開いてみましょう。

見事にModelが作成されています。CakePHPの場合、命名規則が複雑ですので、bakeでモデルやビューを作成してから、手を加えていった方が使いやすいみたいですね。本日は以上です。

-CakePHP
-

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.