2. Зачем нужен ORM?
ORM = Объектно-реляционная проекция
Для сохранения объектов в базу, мы их должны
преобразовать в реляционную форму и наоборот
В нашем коде получается смесь двух совершенно
разных языков - SQL и Perl.
Это тупо неудобно!
my $message = $user->messages->find( $message_id );
3. DBIx::Class
Почему именно он?
Самый популярный
Большое количество плагинов
Есть связки с Catalyst и HTML::FormFu
Я це люблю™
4. Импорт структуры базы
perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::
Schema -e 'My::Schema->connection("dbi:Pg:...", ...)'
5. Основы основ
В DBIx::Class есть две основные сущности
ResultSet
Row
ResultSet - это структура для формирования запроса.
Если метод возвращает этот тип данных, то он не
полезет в базу!
Row - полученная из базы строка. К её столбцам можно
обратиться как $row->column_name
6. Расширение Row-объектов
package My::Schema::Users;
__PACKAGE__->table( 'users' );
__PACKAGE__->add_columns(qw(id first last patronymic));
sub initials {
my $self = shift;
return join ' ', $self->last, map { substr($_,0,1) . "."} ( $self->first,
$self->patronymic);
}
1;
say $user->first;
say $user->last;
say $user->fio;
13. Prefetch
Нам нужно сэкономить на запросах
my $posts = $schema->resultset('Posts');
foreach my $row ($posts->all) {
say $post->forum->moderator->name;
}
14. Всего один запрос
my $posts = $schema->resultset('Posts')->search(undef,{
prefetch => {
forum => 'moderator'
}
});
foreach my $post ( $posts->all ) {
say $post->forum->moderator->name;
}
18. Inflate, Deflate
Мы получаем тип данных из базы и превращаем его в
красивый объект.
И наоборот
Например, мы можем прозрачно сохранять перловую
структуру в каком-то поле!!
man DBIx::Class::InflateColumn
21. DBIx::Class::DynamicSubclass
В зависимости от какого-то флагового поля в базе,
может создавать объекты других типов.
Получаем записи из таблицы Animals, а они сразу bless-
ятся в кошечек и собачек.