分析ThinkORM新增加的虚拟模型功能

 4525

本文给大家介绍分析ThinkORM新增加的虚拟模型功能,希望对需要的朋友有所帮助!

最新版本的ThinkORM增加了一个虚拟模型功能,这个功能早在ThinkPHP3.2版本中出现过,但新版的虚拟模型功能更为强大。

在之前,如果需要进行虚拟模型操作的话,模型类就不能继承Model类,然后封装自己的业务逻辑,虽然也能满足部分需求,但无法实现获取器、修改器以及模型关联的功能,比如:

  1. <?php
  2. namespace app\model;
  3. class User
  4. {
  5.     public function getInfo()
  6.     {
  7.         // 业务逻辑代码
  8.     }
  9. }

新版着重强化了虚拟模型,数据只能保存在内存中,而且只能通过实例化的方式来创建数据,虚拟模型可以保留模型的大部分功能,包括获取器、模型事件,甚至是关联操作,另外一方面也更方便单元测试。

要使用虚拟模型,只需要在模型定义的时候引入Virtual trait,例如:

  1. <?php
  2. namespace app\model;
  3. use think\Model;
  4. use think\model\concern\Virtual;
  5. class User extends Model
  6. {
  7.     use Virtual;
  8.     public function getInfo()
  9.     {
  10.         // 业务逻辑代码
  11.     }
  12.     public function getStatusAttr($value)
  13.     {
  14.         $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
  15.         return $status[$value];
  16.     }
  17.     public function setNameAttr($value)
  18.     {
  19.         return strtolower($value);
  20.     }
  21.     public function blog()
  22.     {
  23.         return $this->hasMany('Blog');
  24.     }
  25. }

你不需要在数据库中存在有对应的user表,但仍然可以进行相关数据操作,下面是一些简单例子。

  1. // 创建数据
  2. $data = [
  3.     'id'      =>    8,
  4.     'name'    =>    'Think',
  5.     'status'  =>    1,
  6. ];
  7. $user = User::create($data);
  8. // 获取数据 (支持获取器)
  9. echo $user->name; // 输出 think
  10. // 修改数据 (支持修改器)
  11. $user->name = 'ThinkPHP'; // 实际数据变成 thinkphp
  12. // 保存数据到内存 并且调用模型事件
  13. $user->save();
  14. // 获取关联博客数据
  15. $blog = $user->blog()->limit(3)->select();
  16. // 删除数据(同时删除关联博客数据)
  17. $user->together(['blog'])->delete();

由于虚拟模型没有实际的数据表,所以你不能进行任何的查询操作,下面的代码就会抛出异常:

  1. User::find(1);
  2. // 会抛出下面的异常
  3. // virtual model not support db query

注意,虚拟模型不支持自动时间戳功能(但仍然支持时间字段格式化),如果需要时间字段需要在实例化的时候传入。

如果有定义获取器、修改器及模型事件的话,仍然有效,大家有时间可以测试下。


本文网址:https://www.zztuku.com/index.php/detail-9057.html
站长图库 - 分析ThinkORM新增加的虚拟模型功能
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    jquery悬停栅格效果