是否可以将“合成”列添加到DBIx :: Class结果类中?合成列的值将由当前行的SQL表达式定义。例如,如果一行包含first
和last
列,我可以合成一个新的只读列,其定义为\"me.first || ' ' || me.last"
(这是Oracle SQL语法)。
在DBIx :: Class文档中的“COMPUTED COLUMNS”下列出了我想要的内容。但是,在这种情况下,似乎已在数据库端定义了该列。我的合成列不在表模式中。
如果失败,在搜索结果集时是否可以将我的SQL表达式添加到生成的SELECT
语句中?
(上面的示例SQL有误导性 - 我需要执行一个涉及数据库函数的SQL表达式,所以我不能只在perl中实现它。)
答案 0 :(得分:3)
也许我错过了一些东西,但我不明白为什么你不能像这样只为你的结果类添加一个方法:
sub name {
my $self = shift;
return $self->first . ' ' . $self->last;
}
答案 1 :(得分:2)
如果计算必须在数据库端完成(在您之前的注释之后),那么请使用我建议的临时列概念以及一些直接SQL。假设你不想在该字段上搜索,那么类似下面的内容应该有效:
my $rs = My::Schema->resultset('people');
my @columns_as = $rs->result_source->columns;
my @columns = map { "me.$_" } @columns_as;
my @people = $rs->search(
{ ... where conditions here ... },
{
select => [ @columns, \"me.first || ' ' || me.last" ], # scalar ref for direct SQL
as => [ @columns_as, 'full_name' ],
order_by => 'full_name',
... etc ...
}
);
# then
print $_->full_name."\n" foreach @people; # now set on the object...
理论上应该可以使用select
和as
来指定其他+select
和+as
列,但我无法让这些列正常工作(这大约一年前)。不记得为什么现在......