DBIx :: Class - 将一个只读的合成列(由SQL定义)添加到结果类中?

时间:2011-10-04 23:40:43

标签: perl dbix-class

是否可以将“合成”列添加到DBIx :: Class结果类中?合成列的值将由当前行的SQL表达式定义。例如,如果一行包含firstlast列,我可以合成一个新的只读列,其定义为\"me.first || ' ' || me.last"(这是Oracle SQL语法)。

在DBIx :: Class文档中的“COMPUTED COLUMNS”下列出了我想要的内容。但是,在这种情况下,似乎已在数据库端定义了该列。我的合成列不在表模式中。

如果失败,在搜索结果集时是否可以将我的SQL表达式添加到生成的SELECT语句中?

(上面的示例SQL有误导性 - 我需要执行一个涉及数据库函数的SQL表达式,所以我不能只在perl中实现它。)

2 个答案:

答案 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...

理论上应该可以使用selectas来指定其他+select+as列,但我无法让这些列正常工作(这大约一年前)。不记得为什么现在......