2012-02-08 4 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

+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 :: Class говорят.

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 ew, поэтому вы скрываете сочетание синтаксиса SQL и объектов