DBIx :: Class - добавить в результирующий класс синтезированный столбец только для чтения (определенный в SQL)? - PullRequest
2 голосов
/ 05 октября 2011

Можно ли добавить «синтезированный» столбец в класс результатов DBIx :: Class? Значение синтезированного столбца будет определяться выражением SQL текущей строки. Например, если в строке есть столбцы first и last, я мог бы синтезировать новый столбец только для чтения, определение которого \"me.first || ' ' || me.last" (это синтаксис Oracle SQL).

Рядом с тем, что я хочу, указано в разделе «ВЫЧИСЛЕННЫЕ КОЛОННЫ» в документации DBIx :: Class. Однако в этом случае кажется, что столбец уже определен на стороне базы данных. Мой синтезированный столбец отсутствует в схеме таблицы.

Если это не так, возможно ли добавить мое выражение SQL в сгенерированный оператор SELECT при поиске в наборе результатов?

(Приведенный выше пример SQL вводит в заблуждение - мне нужно выполнить выражение SQL, включающее функции базы данных, поэтому я не могу просто реализовать его в perl.)

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Возможно, я что-то упускаю, но я не понимаю, почему вы не можете просто добавить метод к вашему классу результатов, например так:

sub name {
  my $self = shift;

  return $self->first . ' ' . $self->last;
}
2 голосов
/ 06 октября 2011

Если вычисление должно быть выполнено на стороне базы данных (после вашего предыдущего комментария), тогда используйте предложенную мной идею временного столбца вместе с некоторым прямым 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, но я не смог заставить их работать должным образом (это было год или около того назад).Не могу точно вспомнить, почему сейчас ...

...