第五章 掌握Model 第三节 把DBIC::Schema作为Mod..
时间:2007-04-25 来源:xiaoshengcaicai
前面一节我们学习了DBIx::Class::Schema, 它是由MySchema.pm跟MySchema/*.pm这些模块组成的,
要在Catalyst里面使用这套模块, 只需要
1. 把MySchema.pm跟MySchema/*.pm 拷贝到项目X的lib目录
2. 建立一个X::Model::MyModel,使之继承自Catalyst::Model::DBIC::Schema,并且使之跟MySchema关联起来。
3. 配置Catalyst::Model::MyModel,比如数据库连接等。
现在继续拿出我们前面几章里面的示例项目: X, 键入命令:
perl x_create.pl Model MyModel DBIC::Schema MySchema
这条命令执行完, 会在lib/X/Model/下面创建X::Model::MyModel.pm,并且该Model跟MySchema是关联的,通过MyModel可以访问MySchema进而使用整套DBIC::Schema.
打开X::Model::MyModel.pm, 会看到:
里面有这样的代码:
__PACKAGE__->config(
schema_class => 'MySchema',
);
这行代码把MyModel跟MySchema关联了起来。
跟第4章里面讲到的一样, Catalyst的组件的配置可以有多种方法,这次我们还是选择老方法, 把配置写到x.yml里面, 所以我们把
__PACKAGE__->config(
schema_class => 'MySchema',
);
这行代码从Mydel.pm里面删掉, 然后在x.yml里面写:
接下来配置这个Model的数据库连接参数,现在整个x.yml如下:
配置工作到此结束, 接下来我们结合之前用到的TT在action里面来使用这个Model:
在root/tt/下面建立一个list.tt,内容如下:
在Root.pm里面添加action如下:
启动我们的x_server.pl,访问http://xxxx/list
你会看到页面:
$c->model('MyModel') 返回的对象有点类似于上一节里面的$schema对象,如果你想从Model得到它里面包含的schema对象,可以使用 $c->model('MyModel')->schema
$c->model('MyModel')->resultset('Book') 这行代码可以缩写为:
$c->model('MyModel::Book')
要在Catalyst里面使用这套模块, 只需要
1. 把MySchema.pm跟MySchema/*.pm 拷贝到项目X的lib目录
2. 建立一个X::Model::MyModel,使之继承自Catalyst::Model::DBIC::Schema,并且使之跟MySchema关联起来。
3. 配置Catalyst::Model::MyModel,比如数据库连接等。
现在继续拿出我们前面几章里面的示例项目: X, 键入命令:
perl x_create.pl Model MyModel DBIC::Schema MySchema
这条命令执行完, 会在lib/X/Model/下面创建X::Model::MyModel.pm,并且该Model跟MySchema是关联的,通过MyModel可以访问MySchema进而使用整套DBIC::Schema.
打开X::Model::MyModel.pm, 会看到:
里面有这样的代码:
__PACKAGE__->config(
schema_class => 'MySchema',
);
这行代码把MyModel跟MySchema关联了起来。
跟第4章里面讲到的一样, Catalyst的组件的配置可以有多种方法,这次我们还是选择老方法, 把配置写到x.yml里面, 所以我们把
__PACKAGE__->config(
schema_class => 'MySchema',
);
这行代码从Mydel.pm里面删掉, 然后在x.yml里面写:
Model::MyModel: schema_class: MySchema |
接下来配置这个Model的数据库连接参数,现在整个x.yml如下:
---
View::MyView:
Model::MyModel: schema_class: MySchema
connect_info:
[这里有空行] |
配置工作到此结束, 接下来我们结合之前用到的TT在action里面来使用这个Model:
在root/tt/下面建立一个list.tt,内容如下:
hello, this is book list <br> [% FOREACH book IN book_list %] id: [% book.id %]<br> name: [% book.name %]<br> author_name: [% book.author.name %]<br> chapters of this book:<br> [% chapters = book.chapters %] <!-- now the chapters is array ref --> [% FOREACH chapter IN chapters %] [% chapter.name %]<br> [% END %] <hr> [% END%] |
在Root.pm里面添加action如下:
sub default : Private { my ( $self, $c ) = @_; $c->response->body( $c->welcome_message ); } sub t :Local { my ( $self, $c ) = @_; $c->stash->{template} = 'test.tt'; } sub list : Local { my ( $self, $c ) = @_; my @book_list = $c->model('MyModel')->resultset('Book')->search( {}, {prefetch => ['author']} ); $c->stash->{book_list} = \@book_list; $c->stash->{template} = 'list.tt'; } sub end : Private { my ( $self, $c ) = @_; $c->forward('View::MyView') unless $c->res->body; } |
启动我们的x_server.pl,访问http://xxxx/list
你会看到页面:
hello, this is book list id: 1 name: book1 author_name: author1 chapters of this book: chapter1 chapter2 chapter3 id: 2 name: book2 author_name: author1 chapters of this book: id: 3 name: book3 author_name: author2 chapters of this book: |
$c->model('MyModel') 返回的对象有点类似于上一节里面的$schema对象,如果你想从Model得到它里面包含的schema对象,可以使用 $c->model('MyModel')->schema
$c->model('MyModel')->resultset('Book') 这行代码可以缩写为:
$c->model('MyModel::Book')
相关阅读 更多 +