2

「合成された」列を DBIx::Class 結果クラスに追加することは可能ですか? 合成された列の値は、現在の行の SQL 式によって定義されます。たとえば、行に と の列がある場合、定義が (これは Oracle SQL 構文です) である新しい読み取り専用のfirstlastを合成でき \"me.first || ' ' || me.last"ます。

DBIx::Class ドキュメントの "COMPUTED COLUMNS" の下に、私が望むものに近いものがリストされています。ただし、その場合、列はデータベース側で既に定義されているようです。合成された列がテーブル スキーマにありません。

SELECTそれができない場合、結果セットを検索するときに生成されたステートメントにSQL 式を追加することはできますか?

(上記の SQL の例は誤解を招くものです。データベース関数を含む SQL 式を実行する必要があるため、perl だけで実装することはできません。)

4

2 に答える 2

3

おそらく何かが足りないのですが、次のように結果クラスにメソッドを追加できない理由がわかりません。

sub name {
  my $self = shift;

  return $self->first . ' ' . $self->last;
}
于 2011-10-05T09:11:50.637 に答える
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...

理論的には、 andを使用して追加の列selectと列を指定するだけでよいはずですが、これらを適切に機能させることができませんでした (これは 1 年ほど前のことです)。正確な理由は今思い出せません...as+select+as

于 2011-10-06T09:50:03.123 に答える