有谁知道这相当于一个SQL查询等的DBIx ::类:什么是CASE WHEN ... THEN SQL语法的DBIx :: Class语法?
SELECT cdr_id, CASE WHEN的service_id = 'GPRS' 然后 'KB' 当的service_id = '短信' 然后 '短信' END AS单元 FROM ...
感谢
有谁知道这相当于一个SQL查询等的DBIx ::类:什么是CASE WHEN ... THEN SQL语法的DBIx :: Class语法?
SELECT cdr_id, CASE WHEN的service_id = 'GPRS' 然后 'KB' 当的service_id = '短信' 然后 '短信' END AS单元 FROM ...
感谢
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" }
}) ;
东西沿着这条线应该工作。
创建填入表 “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 ::课堂上发言。
另一种方式来处理复杂的查询是在确定他们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语法和对象的组合
此解决方案确实有效。我唯一感到遗憾的是它将SQL语法与对象使用混合在一起。所以,如果我们被迫保留一些SQL位,是否真的有兴趣使用DBIx :: Class而不是简单的DBI? – galli2000 2012-02-08 22:50:12
我没有其他方法可以包含您想要的案例表达。它不包含在DBIx :: Class的对象语法糖中。 – dgw 2012-02-08 22:55:00
@ galli2000 DBIC不仅仅是一个SQL生成器。它还会生成有用的对象,修剪连接条件等等。 – 2013-05-03 12:46:38