2012-02-08 40 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" } 
       }) ; 

东西沿着这条线应该工作。

+0

此解决方案确实有效。我唯一感到遗憾的是它将SQL语法与对象使用混合在一起。所以,如果我们被迫保留一些SQL位,是否真的有兴趣使用DBIx :: Class而不是简单的DBI? – galli2000 2012-02-08 22:50:12

+1

我没有其他方法可以包含您想要的案例表达。它不包含在DBIx :: Class的对象语法糖中。 – dgw 2012-02-08 22:55:00

+1

@ galli2000 DBIC不仅仅是一个SQL生成器。它还会生成有用的对象,修剪连接条件等等。 – 2013-05-03 12:46:38

-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语法和对象的组合