2012-02-08 11 views

risposta

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" } 
       }) ; 

Qualcosa lungo questa linea dovrebbe funzionare.

+0

Questa soluzione funziona davvero. L'unica cosa che rimpiango è che mescola la sintassi SQL con gli oggetti. Quindi, se siamo costretti a mantenere alcuni bit SQL, c'è un reale interesse nell'usare DBIx :: Class su un semplice DBI? – galli2000

+1

Non c'è altro modo che conosca per includere l'espressione del caso desiderato. Non è incluso nello zucchero sintattico dell'oggetto di DBIx :: Class. – dgw

+1

@ galli2000 DBIC non è solo un generatore SQL. Genera anche oggetti utili, prugne uniscono condizioni e altro ancora. –

-1

creare una tabella "service_units" popolate con:

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

poi

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

poi tradurre in che parlano DBIx :: Class.

2

Un altro modo per trattare con query complesse è quello di definire loro in un DBIx::Class::ResultSource::View in questo modo:

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 
    ] 
); 

allora si può chiamare come si farebbe chiamare DBIx :: classi normalmente e si otterrà un DBIx: : oggetto Class :: ResultSet (che non consente aggiornamenti o cancellare, però):

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

La cosa bella di questo approccio è che esso permette di query complesse (come quando si dispone di più join complessi o sindacati, seleziona sub ecc.) da nascondere dal codice in ResultSource :: Vi ew, quindi nascondi il mix di sintassi e oggetti SQL