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
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
Non c'è altro modo che conosca per includere l'espressione del caso desiderato. Non è incluso nello zucchero sintattico dell'oggetto di DBIx :: Class. – dgw
@ galli2000 DBIC non è solo un generatore SQL. Genera anche oggetti utili, prugne uniscono condizioni e altro ancora. –