O/R マッパーということで、基本的には、全部のカラムをひっぱってくるわけですが、ちょっと idとタイトルの一覧を表示するだけだから、全部ひっぱり出すのは、ちょっと勿体ないよねぇ…ってときは
my $articles = $schema->resultset('Article')->search(
undef,
{ columns => [qw/ id title /] }
);
のようにすれば、カラムを指定してデータを取ってこれます。
ただし、
__PACKAGE__->many_to_many(
'tags' => 'tagmap',
'tag_id'
);
とか、リレーションを設定しているものにたいしては、うまく動きません。実際にやってみると
my $articles = $schema->resultset('Article')->search(
undef,
{ columns => [qw/ id tags /] }
);
は
DBD::mysql::st execute failed: Unknown column 'me.tags' in 'field list' at /usr/share/perl5/DBIx/Class/Storage/DBI.pm line 782.
DBIx::Class::ResultSet::next(): Error executing 'SELECT me.id, me.tags FROM article me': Unknown column 'me.tags' in 'field list' at select.pl line 19
のようなメッセージを吐いて失敗します。忘れそうなので、メモ。というか普通になんか方法ありそうだけどねぇ(^_^;
どこかのブログで見た方法(どこだかは忘れた……)
$ perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at "Hoge::Schema", {relationships=>1, debug=>1}, ["dbi:mysql:hogedb","root", "内緒"]'
とかすると、MySQL の DBから、スキーマの定義を
Hoge/Schema.pm
Hoge/Schema/テーブル名1.pm
Hoge/Schema/テーブル名2.pm
みたいな形で自動生成してくれます。MySQLで MyISAM を利用していると、外部キー制約? が設定できないので、relationship とはか取り出せない(そもそも設定できてないからあたり前)ですけど……
期間指定で、データを抽出したい時、当初
my $articles = $schema->resultset('Article')->search(
{
created_on => {
'>' => "2006/01/01 00:00:00",
},
created_on => {
'<=' => "2006/01/05 23:59:59"
},
});
でいけるかと思ったんだけど、ダメ。最後のものしか有効にならない。そりゃそうか。
my $articles = $schema->resultset('Article')->search(
{
created_on => {
'>' => "2006/01/01 00:00:00",
'<=' => "2006/01/05 23:59:59"
},
});
とするか、もしくは
my $articles = $schema->resultset('Article')->search(
{
created_on => {
-BETWEEN => [
"$date 00:00:00",
"$date 23:59:59",
]
},
});
が正しいみたい。後者の方が意味がはっきりするのでいいかな?
SELECT
me.id, me.title, me.publish, me.body, me.created_on
FROM
article me
WHERE
( created_on BETWEEN ? AND ? ): '2007-01-09 00:00:00', '2007-01-09 23:59:59'
こんな感じで SQL が発行されます。
DBICのRの拡張は、CDBI とはちょこっと違って気を付けないといけないらしい。
http://d.hatena.ne.jp/nekokak/20061227/1167210571
によると、ResultSetManagerを使うべし、とのこと。
ResultSetRegister の方がいいのかなぁ?
http://code.mfac.jp/trac/file/MoFedge-Data-DBIC-Schema/lib/MoFedge/Data/DBIC/ResultSetRegister.pm
DBICの resultset_attributes を使うとデフォルトの検索条件とかソート条件を指定できる
http://d.hatena.ne.jp/nekokak/20061114/1163488553
へぇ〜これは便利!
Perl/DBIC
http://nekokak.jf.land.to/wiki/wiki.cgi/sub?page=Perl%2FDBIC
しびれるぐらい、よくまとまってる! :-)