Другой способ решения сложных запросов, чтобы определить их в 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 :: классы нормально, и вы получите DBIx: Класс :: ResultSet объект (который не позволит обновлять и удалять, хотя):
my $pruned_cdr = $schema->resultset('ComplexQuery')->search({}, { ... });
хорошая вещь об этом подходе является то, что она позволяет сложных запросов (например, когда у вас есть несколько сложные соединения или объединения, суб выбирает и т. д.), которые будут скрыты от вашего кода в ResultSource :: Vi ew, поэтому вы скрываете сочетание синтаксиса SQL и объектов
Это решение действительно работает. Единственное, о чем я сожалею, это то, что он смешивает синтаксис SQL с использованием объектов. Итак, если мы вынуждены хранить некоторые биты SQL, существует ли реальная заинтересованность в использовании DBIx :: Class над простым DBI? – galli2000
Нет другого способа, которым я знаю, чтобы включить ваше искомое выражение. Он не включен в синтаксический сахар объекта DBIx :: Class. – dgw
@ galli2000 DBIC - это не просто генератор SQL. Он также генерирует полезные объекты, условия соединения чернослива и т. Д. –