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
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
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
@ galli2000 DBIC no es solo un generador SQL. También genera objetos útiles, condiciones de unión de ciruelas pasas, y más. –