2012-02-08 24 views

答えて

6
my $rs = $schema->resultset('table')-> 
    search_rs({} , 
       { '+columns' => { 
        unit => 
         \do { "CASE WHEN me.service_id='GPRS' THEN 'KB' " . 
           "WHEN me.service_id='SMS' THEN 'SMS' END" } 
       }) ; 

... FROM。

+0

このソリューションは実際に動作します。私が後悔しているのは、オブジェクトとSQL構文を混在させるということだけです。ですから、SQLの一部を残しておく必要がある場合は、DBIx :: Classを単純なDBIよりも使用することに本当に関心がありますか? – galli2000

+1

希望のケース式を含めることが他には分かりません。これは、DBIx :: Classのオブジェクト構文糖には含まれていません。 – dgw

+1

@ galli2000 DBICは単なるSQLジェネレータではありません。また、便利なオブジェクト、プルーン結合条件などを生成します。 –

-1

移入テーブル "service_units" を作成します。

service | unit 
--------+----- 
GPRS | KB 
SMS  | SMS 

その後、

SELECT 
    cdr.cdr_id, service_units.unit 
FROM 
    cdr INNER JOIN service_units ON cdr.service_id = service_units.service 

をその後、DBIxにそのを翻訳::クラスは話します。

2

複雑なクエリに対処するための別の方法は、それらを定義することですDBIx::Class::ResultSource::Viewそうのような:

package My::Schema::Result::ComplexQuery 
use strict; 
use warnings; 
use base qw/DBIx::Class::Core/; 

__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); 
__PACKAGE__->table('tablename'); 
__PACKAGE__->result_source_instance->is_virtual(1); 
__PACKAGE__->result_source_instance->view_definition(
    q[ 
     SELECT cdr_id, 
     CASE WHEN service_id = 'GPRS' THEN 'KB' WHEN service_id = 'SMS' THEN 'SMS' END AS unit 
     FROM table 
    ] 
); 

普段::クラスをdbix呼び出すと、あなたはDBIx得るだろうと、あなたはそれを呼び出すことができます。 :クラス::(ただし、更新を許可または削除されません)ResultSetオブジェクト:

my $pruned_cdr = $schema->resultset('ComplexQuery')->search({}, { ... }); 

このアプローチの良いところは、それはあなたが複数の複雑な結合や労働組合があるときのような複雑なクエリ(副選択を可能にするということです等)をコードから隠してResultSource :: ViあなたはSQL構文とオブジェクトの混在を隠します