Skip to content

模型层开发指南

model层是插件开发中的数据模型层,负责数据库表结构的映射、数据查询、数据操作以及业务逻辑与数据库之间的交互。

数据表设计并创建好后,就要准备开发model模型层。

本文以hello_world插件的User模型为例,详细介绍模型的开发方式。

文件存放路径

model模型层的文件存放路径为:niucloud/addon/hello_world/app/model

建议把同类型的功能放在同一个文件夹下方便后续维护扩展。

定义模型

每个model类都需要继承自core\base\BaseModel,并遵循以下基本结构:

php
<?php

namespace addon\hello_world\app\model\user;// 命名空间,对应目录结构

use core\base\BaseModel;// 继承基础模型

/**
 * 用户模型描述
 */
class User extends BaseModel
{
    /**
     * 数据表主键
     * @var string
     */
    protected $pk = 'user_id';  // 设置主键字段

    /**
     * 模型名称
     * @var string
     */
    protected $name = 'user'; // 对应的数据表名(不含表前缀)
}

注意

模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写。如果数据表定义了前缀,要去掉。例如:

数据表(假设数据库的前缀定义是 nc_ )模型类模型名称
nc_userUseruser
nc_user_typeUserTypeuser_type

类型转换

支持给字段设置类型自动转换,类型转换确保数据在读取和写入时自动转换为指定类型,提高数据处理的一致性。例如:

php
/**
 * 类型转换
 * @var array
 */
protected $type = [
    'user_id' => 'integer',      // 主键ID转整数
    'start_time' => 'timestamp', // 开始时间转时间戳,默认的格式为Y-m-d H:i:s
    'end_time' => 'timestamp',   // 结束时间转时间戳,默认的格式为Y-m-d H:i:s
    'score' => 'float',          // 积分转浮点数
    'extend_info' => 'array',    // 扩展信息转数组
];

在查询时,数据会自动转换格式,如图所示:

支持的类型

  • timestamp: 时间戳类型,自动将数据库中的日期时间转换为时间戳

  • integer: 整数类型

  • float: 浮点类型

  • boolean: 布尔类型

  • array: 数组类型

  • json: JSON字符串类型

软删除

软删除功能允许在删除数据时不实际从数据库中删除记录,而是通过标记删除时间字段来实现逻辑删除。

如果需要软删除功能,需要引入SoftDelete特性:

php
// 引入命名空间
use think\model\concern\SoftDelete;

class User extends BaseModel
{
    // 数据软删除
    use SoftDelete;

    /**
     * 定义软删除标记字段
     * @var string
     */
    protected $deleteTime = 'delete_time';

    /**
     * 定义软删除字段的默认值
     * @var int
     */
    protected $defaultSoftDelete = 0;
}

实现效果

删除时不会真正删除数据,而是将 delete_time 字段设置为当前时间戳。查询时会自动过滤掉 delete_time 不为0的记录。

删除:

// 软删除
User::destroy(1);
// 真实删除
User::destroy(1,true);

$user = User::find(1);
// 软删除
$user->delete();
// 真实删除
$user->force()->delete();

查询包含已删除的数据:

User::withTrashed()->find();
User::withTrashed()->select();

查询已删除数据:

User::onlyTrashed()->find();
User::onlyTrashed()->select();

恢复已删除数据:

$user = User::onlyTrashed()->find(1);
$user->restore();

JSON字段设置

对于需要存储JSON格式数据的字段,可以使用以下设置:

php
// 设置json类型字段
protected $json = ['extend_info', 'preferences'];

// 设置JSON数据返回数组
protected $jsonAssoc = true;

使用示例:

php
// 设置JSON数据
$user = User::find(1);
$user->extend_info = [
    'education' => '本科',
    'skills' => ['PHP', 'JavaScript', 'Vue'],
    'address' => [
        'province' => '北京市',
        'city' => '北京市',
        'detail' => '朝阳区某某街道'
    ]
];
$user->save();

// 读取JSON数据
$user = User::find(1);
echo $user->extend_info['education']; // 输出:本科
$skills = $user->extend_info['skills'];  // 直接以数组形式访问
print_r($skills);  // 输出:Array ( [0] => PHP [1] => JavaScript [2] => Vue )

// JSON字段查询
$users = User::where("JSON_EXTRACT(extend_info, '$.education')", '本科')->select();

在查询时,数据会自动转换类型,如图所示:

基于 MIT 协议发布