概要
MojoliciousにはO/RマッパはないのでTengを導入する。
Tengのインストール
cpanmでインストールする。
また、hookを設定するために、
Class::Method::Modifiersもインストールする。
$ cpanm Teng Class::Method::Modifiers
Tengのファイルを作成する
lib/MyApp/DB.pmというファイルを作成する。
このファイルでは以下のような設定を記述する。
- Tengを継承
- 有効にしたいプラグインの設定
- hookの設定
プログラムは以下のような内容になる。
package MyApp::DB;
use parent 'Teng';
use DateTime;
# プラグイン有効
__PACKAGE__->load_plugin('Pager');
__PACKAGE__->load_plugin('Count');
# hookの設定
use Class::Method::Modifiers;
# updateメソッド時にupdated_atに現在時刻を自動入力する
before update => sub {
my ($self, $table_name, $update_row_data, $update_condition) = @_;
if ( !$update_row_data->{updated_at} ) {
$update_row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
}
};
# insertメソッド時にupdated_at/created_atに現在時刻を自動入力する
before insert => sub {
my ($self, $table_name, $row_data) = @_;
$row_data->{created_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
$row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
};
# fast_insertメソッド時にupdated_at/created_atに現在時刻を自動入力する
before fast_insert => sub {
my ($self, $table_name, $row_data) = @_;
$row_data->{created_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
$row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
};
1;
hookの設定は、
全テーブルにcreated_at/updated_atのカラムが存在している前提の内容になっている。
次に、lib/MyApp/DB/Schema.pmを作成する。
このファイルでは以下のような設定をする。
- Schemaの設定
- inflate/deflateの設定
主にスキーマの設定をしていくが、
Teng::Schema::Loaderを使用している場合は、何も書かなくて良い。
package AM::DB::Schema;
use Teng::Schema::Declare;
1;
スキーマ設定の書き方については、
以下のページが参考になる。
https://metacpan.org/pod/Teng::Schema::Declare
すでにDBにテーブルがあり、
スキーマ設定を一つ一つ書くのが面倒くさい場合は、
Teng::Schema::Dumperを使うと楽。
https://metacpan.org/pod/Teng::Schema::Dumper
Tengを参照する設定
Tengに参照するhelperを設定する。
app->helper(
db => sub {
my $c = shift
$c->{___myapp_db} ||= do {
my $dbh = DBI->connect(@config);
Teng::Schema::Loader->load(
namespace => 'MyApp::DB',
dbh => $dbh,
);
};
return $c->{___myapp_db};
}
);
この設定で、Controllerから$self->dbでTengを参照することができる。
get '/' => sub {
my $self = shift;
$self->stash->{users} = [$self->db->search('users')];
$self->render();
};
実際はController内でDBの処理は書かずに、
Modelに渡すなどしたほうが良い。
Teng自体の使い方は、以下のページが参考になる。
クイックスタート - Teng-Doc 0.01 documentation
http://walf443.github.io/teng-doc/quickstart.html