守得云开见月明 首页 关于

MVC框架TP5.0之M

2018-03-25 / Juexe / Web

官方手册精简整理而来,修正了官方手册上的一些错误。

一、模型 / Model

1. 数据库设计和模型定义

名称对应关系

如下表,模型名使用帕斯卡(大驼峰)命名,数据表使用下划线命名法。

模型名数据表
Useruser
UserTypeuser_type

模型定义

namespace app\index\model;
use think\Model;
class User extends Model {
    // 可自定义主键
    protected $pk = 'uid';
    // 如命名规则不符,可自定表名
    protected $table = 'users';
}

TP5.0完全开发手册:模型定义

2. 获取器:查询结果个性化

获取器的作用是在获取数据的字段值后自动进行处理。

例如,我们需要对状态值进行转换,可以使用:

class User extends Model 
{
    public function getStatusAttr($value)
    {
        $status = [0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$value];
    }
}
$user = User::get(1);
echo $user->status; // 例如输出“正常”

获取器还可以定义数据表中不存在的字段,例如:

class User extends Model 
{
    public function getStatusTextAttr($value,$data)
    {
        $status = [0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$data['status']];
    }
}
$user = User::get(1);
echo $user->statusText; // 注意官方手册status_text是错误的。

TP5.0完全开发手册:获取器

3. 修改器:写库前修改值

修改器的作用是可以在数据赋值的时候自动进行转换处理。例如:

class User extends Model 
{
    public function setNameAttr($value)
    {
        return strtolower($value);
    }
}

需使用save方法触发,例如:

$user = new User();
$data['name'] = 'THINKPHP';
$data['email'] = 'thinkphp@qq.com';
$user->save($data);
echo $user->name; // thinkphp

TP5.0完全开发手册:修改器

4. 自动时间戳

系统支持自动写入创建和更新的时间戳字段。

也就是 createTimeupdateTime 两个字段。

方法一、数据库全局配置

// 开启自动写入时间戳字段
'auto_timestamp' => true,
// 开启自动写入时间戳字段
'auto_timestamp' => 'datetime',

方法二、模型内部定义

class User extends Model 
{
    // 开启自动时间戳
    protected $autoWriteTimestamp = true;
    // 自定义字段类型,默认为int
    protected $autoWriteTimestamp = 'datetime';
    // 定义时间戳字段名
    protected $createTime = 'create_at';
    protected $updateTime = 'update_at';
}

TP5.0完全开发手册:时间戳

5. 只读字段:更新时保护字段

我们只需要在模型中定义 readonly 属性:

namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $readonly = ['name','email'];
}

上面定义了当前模型的nameemail只读字段,当执行更新方法之前会自动过滤掉只读字段的值,避免更新到数据库。

TP5.0完全开发手册:只读字段

6. 软删除:假装删除

按照下面的定义就可以使用软删除功能:

namespace app\index\model;

use think\Model;
use traits\model\SoftDelete;

class User extends Model
{
    use SoftDelete;
    protected $deleteTime = 'delete_time';
}

TP5.0完全开发手册:只读字段

以下为控制器内容

删除操作

// 软删除
User::destroy(1);
// 真实删除
User::destroy(1,true);
$user = User::get(1);
// 软删除
$user->delete();
// 真实删除
$user->delete(true);

查询操作

正常查询不会显示被软删除的数据。

// 查询包括软删除的数据
User::withTrashed()->find();
User::withTrashed()->select();
// 只查询软删除的数据
User::onlyTrashed()->find();
User::onlyTrashed()->select();

7. 字段类型转换:读写自动转换

支持给字段设置类型自动转换,会在写入和读取的时候自动进行类型转换处理。例如:

class User extends Model 
{
    protected $type = [
        'status'    =>  'integer',
        'score'     =>  'float',
        'birthday'  =>  'datetime',
        'info'      =>  'array',
    ];
}

TP5.0完全开发手册:只读字段

8. 触发器:数据自动完成

数据自动完成指在不需要手动赋值的情况下对字段的值进行处理后写入数据库。

系统支持autoinsertupdate三个属性,可以分别在写入、新增和更新的时候进行字段的自动完成机制。auto属性包含后两者。

例如我们定义User模型类如下:

namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $auto = [];
    protected $insert = ['ip','status' => 1];  
    protected $update = ['login_ip'];  
    
    protected function setIpAttr()
    {
        return request()->ip();
    }
}

在新增数据的时候,会对ip和 status 字段自动完成或者处理。

$user = new User;
$user->name = 'ThinkPHP';
$user->save();
echo $user->name; // thinkphp
echo $user->status; // 1

在保存操作的时候,会自动完成ip字段的赋值。

$user = User::find(1);
$user->name = 'THINKPHP';
$user->save();
echo $user->name; // thinkphp
echo $user->ip; // 127.0.0.1

开发者需要理清“修改器”与“自动完成”的关系。

TP5.0完全开发手册:数据自动完成

 

(完)

添加评论

Powered by Typecho and Theme by Juexe © 2018 Juexe