ThinkPHP自定义模型

Model 类提供了一些基础的数据库操作方法,当需要进行复杂的数据库操作时,就需要使用自定义模型了。自定义模型能够实现更加灵活和强大的数据库操作,特别是能够 针对项目一些特殊的功能定制数据库操作方案,例如数据检验、数据缓存、数据加工等。使用自定义模型,通常情况下也是需要与数据库的真实表名进行映射,这是 MVC 的一条规范,否则模型就与普通的功能类无异。在调用时,系统提供了D 函数,用于快速实例化自定义模型。
下面将结合示例代码介绍自定义模型的创建和使用。

1.创建自定义模型

自定义模型存放于项目Lib/Model 目录下,假设需要为数据表tpk_article 数据表建立模型映射,那么需要创建ArticleModel.class.php 文件。创建完成后,在使用D 函数进行实例化时,ArticleModel 模型将与tpk_article 表进行映射。由于所有模型都需要继承于Model 基类,所以ArticleModel 拥有Model 所有特性,这里将使用select()方法输出tpk_article 表数据,如以下代码所示。

  1. <?php
  2. class IndexAction extends Action {
  3. public function article(){
  4. $obj=D("Article");
  5. $rows=$obj->select();
  6. dump($rows);
  7. }
  8. }
  9. ?>

使用自定义模型之后,在进行数据表操作时就更加灵活。比如需要让tpk_article 表的内容能够根据客户所在的地区显示当地的新闻,那么就可以在ArticleModel 模型中对数据进行加工和处理,如以下代码所示。

  1. <?php
  2. class ArticleModel extends Model{
  3. public function article(){
  4. $rows=$this->where("area ='{$this->checkUserArea()}'")->select();
  5. return $rows;
  6. }
  7. /**
  8. * 检测用户所在城市
  9. * Enter description here ...
  10. */
  11. protected function checkUserArea(){
  12. import("ORG.Net.IpLocation");
  13. $myip = get_client_ip();
  14. $Ip = new IpLocation("UTFWry.dat");
  15. $area = $Ip->getlocation($myip);
  16. return $area;
  17. }
  18. }
  19. ?>

上述代码中,使用了$this->where 连贯操作,该语句对SQL 查询语句中的where 进行了封装,实际上效果是等同的。在where 查询条件中,限制返回数据条件为当前地区的新闻,checkUserArea 是一个自定义方法,用于根据客户端IP,自动取得当前用户所在的区域,作为一个功能方法不需要对外公开, 所以修饰为protected 。ArticleModel 模型对应的tpk_ article 数据表结构如图7-1 所示。

2.使用自定义模型

使用自定义模型非常简单,系统提供了D 函数,用于快速实例化自定义模型。以前面创建的示例为例,在动作中只需要调用article 方法即可,如以下代码所示。

  1. <?php
  2. class IndexAction extends Action {
  3. public function article(){
  4. $obj=D("Article");
  5. $rows=$obj->als();
  6. $this->assign("list",$rows);
  7. $this->display();
  8. }
  9. }
  10. ?>

这里只是简单地演示自定义模型影射数据表的过程。可以看到,使用自定义模型映射数据表比直接使用基类的模型映射更加灵活和强大。事实上这种方式在主 流的MVC 中使用得最广泛,甚至是必须这样做,例如前面章节介绍过的Zend Framework、Symfony、CakePHP等。使用自定义模型能够实现更复杂及更高级的功能,这里只是简单地演示其使用步骤,在实际应用开发中 可以根据需求利用自定义模型对数据进行深度的加工、处理等。

自定义模型映射,一个模型对应一个数据表。所有增、删、改、查都在模型类中完成,大大地方便了文件及代码的管理。自定义模型的最大特点是代码容易移 植,高度重用。例如一个客户端只能访问XML 格式数据,此时自定义模型一句代码都不用更改,只需要改变动作中的输出格式即可。

这里需要说明的是,在ThinkPHP 中模型代码是可以直接移植到动作中的,但这样就让代码的重复利用变差,代码的管理、维护变得困难,所以建议读者尽量将数据库操作的逻辑封装到自定义模型中,这也是MVC 编程所提倡的思想。