2012-02-08 12 views

Respuesta

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

Algo a lo largo de esta línea debería funcionar.

+0

Esta solución funciona de hecho. Lo único que lamento es que mezcla la sintaxis SQL con el uso de objetos. Entonces, si nos vemos obligados a mantener algunos bits de SQL, ¿hay un interés real en usar DBIx :: Class sobre DBI simple? – galli2000

+1

No hay otra forma que conozca para incluir la expresión de su caso deseado. No está incluido en el objeto de azúcar sintáctico de DBIx :: Class. – dgw

+1

@ galli2000 DBIC no es solo un generador SQL. También genera objetos útiles, condiciones de unión de ciruelas pasas, y más. –

-1

crear una tabla "service_units" pobladas con:

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

continuación

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

luego traducir eso en hablar DBIx :: Clase.

2

Otra manera de tratar con consultas complejas es definirlos en una DBIx::Class::ResultSource::View así:

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

entonces se le puede llamar como se puede llamar DBIx :: clases normalmente y podrás obtener un DBIx: : objeto Class :: conjunto de resultados (que no permitirá cambios o eliminar, sin embargo):

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

lo bueno de este enfoque es que permite consultas complejas (como cuando se tiene compleja varias combinaciones o uniones, selecciona sub etc.) para esconderse de su código en un ResultSource :: Vi ew, por lo que oculta la mezcla de sintaxis SQL y objetos

Cuestiones relacionadas