2011-10-04 46 views
2

是否可以向DBIx :: Class結果類中添加「合成」列?合成列的值將由當前行的SQL表達式定義。例如,如果一行具有列firstlast,我可以合成一個新的只讀列,其定義爲\"me.first || ' ' || me.last"(這是Oracle SQL語法)。DBIx :: Class - 將只讀合成列(由SQL定義)添加到結果類中?

接近我想要的是在DBIx :: Class文檔中的「COMPUTED COLUMNS」下列出的。但是,在這種情況下,似乎列已經在數據庫端定義了。我的合成列不在表格模式中。

失敗的是,當我搜索結果集時,是否可以將SQL表達式添加到生成的SELECT語句中?

(上面的例子SQL是一種誤導 - 我需要執行,涉及到數據庫的功能,所以我不能只是實現它在Perl SQL表達式。)

+0

如果您有權訪問IRC,那麼irc.perl.org上的#dbix-class頻道應該能夠回答任何與DBIC相關的問題 – plusplus

+0

但是,請在此處張貼它們對於後人 – cubabit

回答

3

也許我失去了一些東西,但我不」看不到,爲什麼你不能只添加一個方法來你的結果類是這樣的:

sub name { 
    my $self = shift; 

    return $self->first . ' ' . $self->last; 
} 
+1

是的,如果有一個更復雜的計算涉及到你不想重複的話,那麼只需要一個屬性給類(又名'臨時列')來存儲使用其中一個Accessor包的結果,例如https://metacpan.org/module/Class::訪問者:快速 – plusplus

+0

也許我的例子是誤導 - 我需要在數據庫端進行計算 - 在我使用數據庫函數的情況下。 – ErikR

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只是指定額外selectas列,但我無法讓這些工作正常工作(這是大約一年前)。現在無法完全記得爲什麼...

相關問題