一、模型-》数据模型
模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写。
模型同样支持初始化,与控制器的初始化不同的是,模型的初始化是重写Model的initialize。
二、新建模型
namespace app\index\model;
use think\Model;
class User extends Model
{
}
三、调用:
// 静态调用
$user = User::get(1);
$user->name = 'thinkphp';
$user->save();
// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();
// 使用 Loader 类实例化(单例)
$user = Loader::model('User');
// 或者使用助手函数`model`
$user = model('User');
$user->name= 'thinkphp';
$user->save();
四、操作:
类似于数据库的操作
五、获取器:
获取器的作用是在获取数据的字段值后自动进行处理,
class User extends Model
{
public function getStatusAttr($value)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
数据表的字段会自动转换为驼峰法,一般status
字段的值采用数值类型,我们可以通过获取器定义,自动转换为字符串描述。
$user = User::get(1);
echo $user->status; // 例如输出“正常”
获取器还可以定义数据表中不存在的字段,例如:
class User extends Model
{
public function getStatusTextAttr($value,$data)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$data['status']];
}
}
获取器方法的第二个参数传入的是当前的所有数据数组。
我们就可以直接使用status_text字段的值了,例如:
$user = User::get(1);
echo $user->status_text; // 例如输出“正常”
获取器只有当获取某个数据属性的时候自动触发,如果你要获取包含获取器处理的全部数据属性的话,可以使用下面的方法:
$user = User::get(1);
// 获取全部获取器数据
dump($user->toArray());
获取原始数据
如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用:
$user = User::get(1);
// 通过获取器获取字段
echo $user->status;
// 获取原始字段数据
echo $user->getData('status');
// 获取全部原始数据
dump($user->getData());
六、时间戳:
系统支持自动写入创建和更新的时间戳字段,有两种方式配置支持。
第一种方式,是在数据库配置文件中添加全局设置:
// 开启自动写入时间戳字段
'auto_timestamp' => true,
第二种是直接在单独的模型类里面设置:
protected $autoWriteTimestamp = true;
如果这两个地方设置为true,默认识别为整型int
类型,如果你的时间字段不是int
类型的话,例如使用datetime
类型的话,可以这样设置:
// 开启自动写入时间戳字段
'auto_timestamp' => 'datetime',
或者
protected $autoWriteTimestamp = 'datetime';
字段名默认创建时间字段为create_time
,更新时间字段为update_time
,支持的字段类型包括timestamp/datetime/int
。
写入数据的时候,系统会自动写入create_time
和update_time
字段,而不需要定义修改器,例如:
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->create_time; // 输出类似 2016-10-12 14:20:10
echo $user->update_time; // 输出类似 2016-10-12 14:20:10
如果你的数据表字段不是默认值的话,可以按照下面的方式定义:
class User extends Model
{
// 定义时间戳字段名
protected $createTime = 'create_at';
protected $updateTime = 'update_at';
}
下面是修改字段后的输出代码:
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->create_at; // 输出类似 2016-10-12 14:20:10
echo $user->update_at; // 输出类似 2016-10-12 14:20:10
如果你只需要使用create_time
字段而不需要自动写入update_time
,则可以单独设置关闭某个字段,例如:
class User extends Model
{
// 关闭自动写入update_time字段
protected $updateTime = false;
}
如果不需要任何自动写入的时间戳字段的话,可以关闭时间戳自动写入功能,设置如下:
class User extends Model
{
// 关闭自动写入时间戳
protected $autoWriteTimestamp = false;
}
如果是关闭全局的自动时间写入,则可以使用:
// 关闭全局自动写入时间字段
'auto_timestamp' => false,
七、只读字段
只读字段用来保护某些特殊的字段值不被更改,这个字段的值一旦写入,就无法更改。 要使用只读字段的功能,我们只需要在模型中定义readonly
属性
八、修改器
修改器的作用是可以在数据赋值的时候自动进行转换处理.