inflate_column

ブログが続かないわけ | DBIC で+select と+as : ああ、今頃気づくなんて...

でも、どうにも不便だと思ってDBIx::Class::ResultsetのPODを読んでいると、+select と+as なるものがあるじゃないですか。これだと、まさに先ほど直感的に書いたような方法で書けるのです。

$c->model('DBIC::TranDiary')->search(
    $query_ref,
    {
        '+select' => [
            { date_format => 'me.create_date,\'%Y/%m/%d\'' },
        ],
        '+as' => [
            qw/create_date/
        ]
    }
);

これって常識なんだろな。だってPODに書いてあるんだもん。
ちょっとへこみました。

+select と +as なんて、あるんだなー便利だなーと思いつつ、それは、inflate_column を使った方が良いんじゃないかと思いました。

上記の例であれば、xxxxx::Model::DBIC::TranDiary に下記を追加。

__PACKAGE__->inflate_column(
  'create_date',
  {
    inflate => sub { DateTime::Format::xxx->parse_datetime(shift);  },
    deflate => sub { DateTime::Format::xxx->format_datetime(shift); },
  }
);

DateTime::Format::xxx の、xxx の箇所は、Pg、MySQLOracleDB2 等が CPAN にあるので、環境にあわせて選択。
search メソッドだけでなく、create メソッドでも使えるので、こちらの方が便利かと。