6获取器
未知
2021-07-04 11:22:49
0

获取器

获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public类型),方法命名规范为:

getFieldNameAttr

FieldName为数据表字段的驼峰转换,定义了获取器之后会在下列情况自动触发:

  • 模型的数据对象取值操作($model->field_name);
  • 模型的序列化输出操作($model->toArray()toJson());
  • 显式调用getAttr方法($this->getAttr('field_name'));

获取器的场景包括:

  • 时间日期字段的格式化输出;
  • 集合或枚举类型的输出;
  • 数字状态字段的输出;
  • 组合字段的输出;

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

<?php
namespace app\model;

use think\Model;

class User extends Model 
{
    public function getStatusAttr($value)
    {
        $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$value];
    }
}
复制

数据表的字段会自动转换为驼峰法,一般status字段的值采用数值类型,我们可以通过获取器定义,自动转换为字符串描述。

$user = User::find(1);
echo $user->status; // 例如输出“正常”
复制

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

<?php
namespace app\model;

use think\Model;

class User extends Model 
{
    public function getStatusTextAttr($value,$data)
    {
        $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$data['status']];
    }
}
复制

获取器方法的第二个参数传入的是当前的所有数据数组。

我们就可以直接使用status_text字段的值了,例如:

$user = User::find(1);
echo $user->status_text; // 例如输出“正常”
复制

获取原始数据

如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用:

$user = User::find(1);
// 通过获取器获取字段
echo $user->status;
// 获取原始字段数据
echo $user->getData('status');
// 获取全部原始数据
dump($user->getData());
复制

由于自动时间戳的处理没有走获取器的方式,如果要获取自动时间字段的原始数据,需要使用

$user = User::find(1);
// 通过获取器获取自动时间字段
echo $user->create_time;
// 获取时间字段原始字段数据
echo $user->getOrigin('create_time');
// 获取全部原始数据
dump($user->getOrigin());
复制

动态获取器

可以支持对模型使用动态获取器,无需在模型类中定义获取器方法。

User::withAttr('name', function($value, $data) {
	return strtolower($value);
})->select();
复制

withAttr方法支持多次调用,定义多个字段的获取器。另外注意,withAttr方法之后不能再使用模型的查询方法,必须使用Db类的查询方法。

如果同时还在模型里面定义了相同字段的获取器,则动态获取器优先,也就是可以临时覆盖定义某个字段的获取器。

支持对关联模型的字段使用动态获取器,例如:

User::with('profile')->withAttr('profile.name', function($value, $data) {
	return strtolower($value);
})->select();
复制

注意:对于MorphTo关联不支持使用动态获取器。

并且支持对JSON字段使用获取器,例如在模型中定义了JSON字段的话:

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
	// 设置json类型字段
	protected $json = ['info'];
}
复制

可以使用下面的代码定义JSON字段的获取器。

User::withAttr('info.name', function($value, $data) {
	return strtolower($value);
})->select();
复制

可以在查询之后使用withAttr方法,例如:

User::select()->withAttr('name', function($value, $data) {
	return strtolower($value);
});
复制

上一篇:JSON字段

下一篇:6修改器

相关内容

MySQL变量的生命周期管...
MySQL变量管理关键在于生命周期控制。需了解全局、会话及用户自定...
2024-11-20 20:46:37
MySQL变量的作用域与访...
摘要: MySQL变量具有作用域和访问控制,局部变量限于特定上下...
2024-11-20 20:00:40
动态分配MySQL变量的示...
MySQL中,变量用于存储临时数据,包括全局和会话变量以及用户定义...
2024-11-20 18:23:38
MySQL变量存储的数据类...
MySQL支持多种数据类型以存储不同种类的变量,包括数值型、字符串...
2024-11-20 18:00:48
MySQL变量在数据库操作...
MySQL变量在数据库操作中至关重要,用于存储数据、配置操作、实现...
2024-11-20 17:46:42
K8s在云服务器上的资源管...
K8s作为开源容器编排系统,在云服务器上实现自动化资源管理,提高运...
2024-11-20 17:23:38

热门资讯

tp6开发规范 命名规范 请理解并尽量遵循以下命名规范,可以减少在开发过程中出现不必要的错误。 ThinkPHP6....
6高级查询 快捷查询 快捷查询方式是 一种多字段相同查询条件 的简化写法,可以进一步简化查询条件的写法,在多个字...
tp6多应用提示控制器不存在:... 第一个情况是没有使用composer安装扩展。 如果要使用多应用模式, 你需要win+r,cmd指针...
6配置 配置目录 单应用模式 对于单应用模式来说,配置文件和目录很简单,根目录下的 config 目录下面就...
6异常处理 和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个人性化的错误页面。 异...
6swoole 本篇内容主要讲述了最新的 think-swoole 扩展的使用。目前仅支持Linux环境或者MacO...
6助手函数 助手函数 系统为一些常用的操作方法封装了助手函数,便于使用,包含如下: 助手函数 描述 abort ...
6查询表达式 查询表达式 查询表达式支持大部分的SQL查询语法,也是 ThinkPHP 查询语言的精髓,查询表达式...
6路由参数 路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及后续行为。 路由参数可...
6查询 模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对...