文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>第五章 掌握Model 第三节 把DBIC::Schema作为Mod..

第五章 掌握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::MyModel:

  schema_class: MySchema


接下来配置这个Model的数据库连接参数,现在整个x.yml如下:

---
name: X

View::MyView:
  INCLUDE_PATH:
    - __HOME__/root/tt
  TEMPLATE_EXTENSION: .tt

Model::MyModel:

  schema_class: MySchema

  connect_info:
    - 'dbi:mysql:x;localhost'
    - 'root'
    - ''
    - AutoCommit: 1
      PrintError: 1

[这里有空行]


配置工作到此结束, 接下来我们结合之前用到的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')
相关阅读 更多 +
排行榜 更多 +
方块枪战战场安卓版

方块枪战战场安卓版

飞行射击 下载
战斗火力射击安卓版

战斗火力射击安卓版

飞行射击 下载
空中防御战安卓版

空中防御战安卓版

飞行射击 下载