首頁 >php框架 >ThinkPHP >分析ThinkORM新增加的虛擬模型功能

分析ThinkORM新增加的虛擬模型功能

藏色散人
藏色散人轉載
2021-08-06 09:27:292470瀏覽

本文由thinkphp框架教學專欄為大家介紹分析ThinkORM新增加的虛擬模型功能,希望對需要的朋友有幫助!

最新版本的ThinkORM增加了一個虛擬模型功能,這個功能早在ThinkPHP3.2版本中出現過,但新版的虛擬模型功能更為強大。

在之前,如果需要進行虛擬模型操作的話,模型類別就不能繼承Model類,然後封裝自己的業務邏輯,雖然也能滿足部分需求,但無法實現獲取器、修改器以及模型關聯的功能,例如:

<?php
namespace app\model;
class User
{
    public function getInfo()
    {
        // 业务逻辑代码
    }
}

新版著重強化了虛擬模型,數據只能保存在記憶體中,而且只能透過實例化的方式來創建數據,虛擬模型可以保留模型的大部分功能,包括獲取器、模型事件,甚至是關聯操作,另一方面也更方便單元測試。

要使用虛擬模型,只需要在模型定義的時候引入Virtual trait,例如:

<?php
namespace app\model;
use think\Model;
use think\model\concern\Virtual;
class User extends Model
{
    use Virtual;
    public function getInfo()
    {
        // 业务逻辑代码
    }
    public function getStatusAttr($value)
    {
        $status = [-1=>&#39;删除&#39;,0=>&#39;禁用&#39;,1=>&#39;正常&#39;,2=>&#39;待审核&#39;];
        return $status[$value];
    }
    public function setNameAttr($value)
    {
        return strtolower($value);
    }
    public function blog()
    {
        return $this->hasMany(&#39;Blog&#39;);
    }
}

你不需要在資料庫中存在有對應的user表,但仍然可以進行相關數據操作,以下是一些簡單例子。

// 创建数据
$data = [
    &#39;id&#39;      =>    8,
    &#39;name&#39;    =>    &#39;Think&#39;,
    &#39;status&#39;  =>    1,
];
$user = User::create($data);
// 获取数据 (支持获取器)
echo $user->name; // 输出 think
// 修改数据 (支持修改器)
$user->name = &#39;ThinkPHP&#39;; // 实际数据变成 thinkphp
// 保存数据到内存 并且调用模型事件
$user->save();
// 获取关联博客数据
$blog = $user->blog()->limit(3)->select();
// 删除数据(同时删除关联博客数据)
$user->together([&#39;blog&#39;])->delete();

由於虛擬模型沒有實際的資料表,所以你不能進行任何的查詢操作,下面的程式碼就會拋出例外:

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

注意,虛擬模型不支援自動時間戳功能(但仍支援時間欄位格式化),如果需要時間欄位需要在實例化的時候傳入。

如果有定義獲取器、修改器及模型事件的話,仍然有效,大家有時間可以測試下。

相關推薦:最新的10個thinkphp影片教學

#

以上是分析ThinkORM新增加的虛擬模型功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:thinkphp。如有侵權,請聯絡admin@php.cn刪除