DBICによるモデル作成
DBIx::Classを Catalyst のモデルクラスとして使うことができる。DBIx::Classはデータアクセス機能しかないが、Catalyst上で利用する場合はモデルとしての機能が強化されており、データアクセスのロジックを直接スキーマクラスに記述することができる。
準備
まずはDBIx::Classをインストール
CatalystのDBIサポート関連クラスをCPANでインストール
- Catalyst::Model::DBIC::Schema
- Catalyst::Helper::Model::DBIC::Schema
適当なテーブルを作る。
CREATE TABLE books ( id INTEGER NOT NULL AUTO_INCREMENT, isbn VARCHAR(13), title VARCHAR(255) NOT NULL, author VARCHAR(255), summary TEXT, PRIMARY KEY(id) ) CHARACTER SET utf8 TYPE=innoDB; -- テスト用に適当なデータもセット INSERT INTO books (isbn, title, author) VALUES ('0000000000000','Necronomicon','Abdul Alhazred');
DBIx::Classでモデルを作成
$ ./script/hoge_create.pl model DBIC DBIC::Schema Hoge::Schema create=dynamic dbi:mysql:databasename username password
または
$ ./script/hoge_create.pl model DBIC DBIC::Schema Hoge::Schema create=static dbi:mysql:databasename username password
意味は
model (モデル名) (親になるスキーマクラス) (作成するスキーマクラス) (スキーマクラスの生成方法) (DBIのデータベース接続設定)
create=staticとすると、データベースに接続してテーブル情報からスキーマクラスを作成してくれる。create=dynamicの場合はスキーマクラス作成を実行時に行う(DBIx::Class::Schema::Loaderを使う)。最近のフレームワーク(Rails、Django)のモデル生成は実行時生成が基本であり楽なので dynamic をお勧めする。
個人的にはモデル名はデータベース名にすると良いと思う、そうすると…
$c->model('データベース名::テーブル名')
となって何となく分かりやすい感じ。
以下のファイルができる
- ${APP_ROOT}/lib/Hoge/Model/DBIC.pm
- ${APP_ROOT}/lib/Hoge/Schema.pm
staticの場合はさらに
- ${APP_ROOT}/lib/Hoge/Schema/Items.pm
- ${APP_ROOT}/lib/Hoge/Schema/Categories.pm
などテーブルに対応するクラスが出来る。このSchema以下のクラスにはカラム定義、リレーション定義、インフレート設定、追加メソッドなどを記述できる。dynamicの場合はこれを実行時に作成する。dynamic生成の場合でリレーションやインフレート設定などを記述したい時は、これらのクラスを自分で作って設置する。このときでもカラム定義は書かなくていい。
コントローラ ${APP_ROOT}/lib/Hoge/Controller/Test.pm を修正
sub hello : Local { my ($self, $c) = @_; $c->stash->{hogehoge} = $c->model("DBIC::Books")->find(1)->title; }
$c→model
の引数、
$c->model('モデル名::テーブルのスキーマクラス名')
あるいは
$c->model('モデル名')->resultset('テーブルのスキーマクラス名')
モデル名はモデルをヘルパースクリプトで作った時の名前に対応。テーブルのスキーマクラス名は、テーブル名に対応して決まる。テーブル名が hoge
ならばクラス名は Hoge
、hoge_fuga
ならば HogeFuga
になる。
サーバを起動してhttp://localhost:3000/test/helloへアクセス。Necronomiconと表示されたらめでたくモデルも出来ました。