DBDesigner 4 と連携してER図から半自動でアプリ生成のエントリを見てDBDesigner4を知り,前のエントリで作成したER図からコードを生成してみます。
Scaffoldって
Scaffoldとは何か調べようとYahoo!辞書を見たら「処刑台」とあってびっくり。しかし「(一時的な)組立て舞台」という意味もあるとか。そうこの意味でしょうね当然。Scaffoldを使うと簡単に入力画面を作ってしまえるようです。用途としては開発初期段階でのデータエントリやデータの確認に使えますよという感じでしょうか。コントローラに$scaffoldという変数を用意するだけです。実際にやってみます。利用するテーブルは次の図のものです。

この中のgroupsテーブルを操作する画面を作ってみます。まずモデルの作成
<?php class Group extends AppModel { var $name = 'Group'; } ?>
名前だけを定義した最も手抜きモデルです。モデル名はテーブル名の単数形です。
<?php class GroupsController extends AppController { var $name = 'Groups'; var $scaffold; } ?>
コントローラは複数形+Controllerという名前にします。
何も書いていないに等しいようなコードですがこれでどうでしょうか。ブラウザからhttp://localhost/webapp/groupsを表示するとgroupsテーブルの一覧が表示され,レコードの訂正や追加もできます。非常に簡単です。employeesテーブルに関しても同様にやってみました。ちゃんと表示されます。

employeesテーブルの追加画面の一部です。Group Idのフィールドは普通のテキストボックスになっています。これ覚えておいてください。
dbdesigner2cake.phpを使う
dbdesigner2cake.phpは,DBDesigner4で作ったxmlファイルを渡すと,各テーブルのモデルとScaffoldを利用したコントローラを自動で作ってくれるツールです。Scaffoldを使ったコントローラといっても前述の通り非常に簡単ですから,わざわざこういうツールを使うまでもないようにも思えますが,テーブルの数が多くなったらそれなりに便利だろうと思うのでやってみました。
事前に,これまで作ったモデルとコントローラのPHPファイルを削除しておきます。
dbdesigner2cake.phpを開発環境のCakePHPのルートフォルダ(このブログの記事の場合にはwebappフォルダです)に置きます。そこに,DBDesginer4で保存したデータベースモデルを保存したxmlファイルも同じ場所にコピーしておきます。そしてコマンドプロンプトから次のように実行します。
C:\xampp\htdocs\webapp>php.exe dbdesigner2cake.php time_card.xml Scaffolding Employee -- done Scaffolding Group -- done Scaffolding TimeCard -- done Scaffolding EventKind -- done Done
なんだか終わったようです。作成されたコントローラとモデルを見てみます。コントローラの方はもう全くなんてことはありません。$nameと$scaffoldを定義しているだけです。モデルの方はDBDesigner4て定義したリレーションシップが反映されたソースになっています。
<?php class Employee extends AppModel { var $name = 'Employee'; var $transactional = 1; var $hasMany = Array( 'TimeCard' => array('className' => 'TimeCard', 'foreignKey' => 'employee_id', 'conditions' => '', 'fields' => '', 'order' => '', 'counterCache' => '' ), ); var $belongsTo = Array( 'Group' => array('className' => 'Group', 'foreignKey' => 'group_id', 'conditions' => '', 'fields' => '', 'order' => '', 'counterCache' => '' ), ); } ?>
employee.phpのソースです。これを作ってくれるというのは非常に便利じゃないでしょうか。これからモデル作りはこれだな。
dbdesigner2cake.phpで作った状態で,先ほどのようにemployeesの新規追加画面を見てみますと,

図のようにGroup IdとあったところがGroupという名前になってプルダウンコンボになっています。おおこれは!外部キーとして定義されていたら自動でこうなるのか。しかし一覧を見るとID自体がリストされています。本当はgroup_nameがリストされて欲しいところ。これはどうやらnameというフィールドがあればそれをリストするようです。他の名前のフィールドをリストさせたい場合はモデルに次のような記述を追加します。
var $displayField = 'group_name';
これで再表示してみると見事にリストされました。employeesも外部参照されていますがnameフィールドがあるのでそのままでOK。event_kindモデルにも次のように定義します。
var $displayField = 'event_kind';
命名規則を守ろう
ここまでCakePHPをさわってみて感じた感想です。命名規則を守ろう。意地を張らずにこの言葉を聞いておけば楽ができます。さきほどの$displayFieldの設定など必要ないように各テーブルに[name]というフィールドを作っておいた方がいいように思います。