Довольно часто возникает необходимость вместе с запросом к базе произвести ещё какие либо действия. Причём произвести их для любого запроса данного типа (INSERT, SELECT и пр.). Ну например, нужно налету преобразовывать кодировку таблицы или столбца таблицы или при сохранении записи закодировать одно из полей, а при считывании раскодировать. Ну или подсунуть время с изменённым часовым поясом... в общем много применений.
Так вот, всё это очень легко делается для DBIx классом DBIx::Class::Row Он содержит все низкоуровневые вызовы основных методов работы с DBIx::Class::ResultSource объектами.
итак...
Теперь на любой select к этой таблице поле text будет перекодироваться при каждом запросе. Конечно, не очень правильно перекодировать на лету поля из базы, но это всё-таки пример.
Для select'а было не просто найти нужный метод, с остальными основными методами всё проще. Они называются как и ожидается: insert, update и delete
Так вот, всё это очень легко делается для DBIx классом DBIx::Class::Row Он содержит все низкоуровневые вызовы основных методов работы с DBIx::Class::ResultSource объектами.
итак...
package My::Schema::Result::MyText;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;
use Encode qw/from_to encode decode/;
__PACKAGE__->table('texts');
__PACKAGE__->add_columns(qw/id text/);
__PACKAGE__->set_primary_key('id');
sub inflate_result {
my $self = shift;
my $ret = $self->next::method(@_);
my $octets = $ret->text;
from_to($octets, 'koi8-r', 'utf-8');
$ret->{_column_data}->{text} = decode("utf8", $octets);
return $ret;
}
Теперь на любой select к этой таблице поле text будет перекодироваться при каждом запросе. Конечно, не очень правильно перекодировать на лету поля из базы, но это всё-таки пример.
Для select'а было не просто найти нужный метод, с остальными основными методами всё проще. Они называются как и ожидается: insert, update и delete
Комментариев нет:
Отправить комментарий