任意のSQLを実行する

任意のSQLを書いたテーブルクラスを以下のように作成する。

 package MyApp::Schema::Result::UserExt;
 use base 'DBIx::Class';
 
 __PACKAGE__->load_components(qw/Core/);
 __PACKAGE__->table("NONE");
 __PACKAGE__->add_columns(qw/user_id/);
 __PACKAGE__->result_source_instance->name(\"(
 SELECT
     user_id
 FROM
     user
 WHERE
     status = ?
 )");
 
 1;

上記のテーブルクラスを以下のようにして使う。

 my @users = $schema->resultset( 'UserExt' )->search( {}, 
   {
     bind  => [ 1 ]
   }
 )->all;

この際、実行されるSQLは以下のようになる。

 SELECT me.user_id FROM (
 SELECT
    user_id
 FROM
    user
 WHERE
    status = ?
 ) me

基になるテーブルクラスがある場合

そのパッケージを継承する。例えばUserパッケージが基になるテーブルクラスの場合、以下のようになる。

 package MyApp::Schema::Result::UserExt;
 use base 'MyApp::Schema::Result::User';
 
 __PACKAGE__->load_components(qw/Core/);
 __PACKAGE__->table("NONE");
 __PACKAGE__->result_source_instance->name(\"(略)");
 
 1;

すると、UserExtの結果セットクラスでUserパッケージのメソッドをそのまま使える。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2010-06-09 (水) 08:55:44