DBIx::Customで「モデル」を利用する




  1. Perl




  2. モジュール




  3. データベース




  4. DBIx::Custom



  5. 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');