Другой способ справиться со сложными запросами - определить их в 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 :: classes, и вы получите объект DBIx :: Class :: ResultSet (который, однако, не будет разрешать обновления или удалять):
my $pruned_cdr = $schema->resultset('ComplexQuery')->search({}, { ... });
Хорошая вещь в этом подходечто он позволяет скрывать сложные запросы (например, когда у вас есть несколько сложных объединений или объединений, вложенных выборок и т. д.) из кода в ResultSource :: View, поэтому вы скрываете сочетание синтаксиса SQL и объектов