DBIx::Customで「モデル」を利用する
Perl
›
モジュール
›
データベース
›
DBIx::Custom
›
here
DBIx::Customで「モデル」を利用する方法を解説します。
モデルを生成する - create_model
モデルを作成するにはcreate_modelメソッドを使用します。
$dbi->create_model( table => 'book', primary_key => 'id', join => [ 'left outer join company on book.company_id = company.id' ], ctime => 'ctime', mtime => 'mtime' );
モデルには、「table - テーブル名」「primary_key - プライマリーキー」「join - join節」「ctime - 作成日時」「mtime - 更新日時」などを設定しておくことができます。
これらはモデルからinsert,update,delete,selectメソッドを呼び出したときに自動的に利用されるようになります。
モデルの取得
作成したモデルはmodelメソッドでテーブル名を指定して取得することができます。
my $book_model = $dbi->model('book');
モデルはDBIx::Custom::Modelオブジェクトです。モデルからはDBIx::Custom::Modelが持つメソッドと、DBIx::Customが持つ全てのメソッドを呼び出すことができます。
モデルの利用
モデルではinsert,update,delete,select,countなどのメソッドを利用することができます。table、primary_key、joinといったオプションを省略することができ記述が簡潔になります。
my $result = $model->select( column => [ {company => [qw/name/]} ] );
またモデルからはDBIx::CustomあるいはDBIのすべてのメソッドを呼び出すことが可能です。
外部定義したモデルの取り込み - include_model
外部で定義したモデルを、プログラムに取り込むにはinclude_modelメソッドを使用します。DBIx::Customではプログラムが大きくなってきたときに、モデルを外部に定義し、保守性を高めることができます。
$dbi->include_model('MyModel');
この例ではMyModelという名前空間以下に属するすべてのモデルを取り込みます。またMyModelという名前のモジュールが必要であることにも注意してください。
lib / MyModel.pm / MyModel / book.pm / company.pm
モデルのサンプル
MyModel
MyModelは一般的には次のようになります。DBIx::Custom::Modelを継承するようにします。
package MyModel; use DBIx::Custom::Model -base; 1;
-baseオプションは継承のためのオプションで、Object::Simpleから引き継いでいます。
MyModel::book
MyModel::bookは次のようになります。MyModelを継承するようにします。
has primary_key => 'book_id'; has ctime => 'created_time'; has mtime => 'modified_time'; has join => sub { [ 'left join company on book.company_id = company.id', 'left join author on book.author_id = author.id' ] } 1;
hasは属性を定義するためのメソッドで、Object::Simpleの機能です。
モデルをセットアップする - setup_model
モデルをセットアップするにはsetup_modelを使用します。データベースのテーブル情報を調べて、モデル(DBIx::Custom::Model)のcolumnsに列名が自動的に設定されます。
$dbi->setup_model;
DBIx::Custom::Modelのcolumns属性が設定されていれば、DBIx::Custom::Modelのmycolumnメソッドを使って、テーブルに含まれるすべての列を含むcolumn節を生成できます。
my $book_model = $dbi->model('book'); my $column_clause = $book_model->mycolumn;
すべての列を含む次のようなcolumn節が生成されます。
book.author as author, book.title as title, book.price as price
また列名を指定しないで、DBIx::Customのcolumnメソッドを使うこともできます。
my $column_clause = $dbi->column('book');
次のようなすべての列を含むcolumn節が生成されます。
book.author as "book.author", book.title as "book.title", book.price as "book.price"
モデルを取得する - model
modelメソッドを使って、create_modelメソッドやinclude_modelメソッドで作成したモデルを取得することができます。
my $model = $dbi->model('book');