有誰知道這相當於一個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