获取器
//// 定义
namespace app\index\model;
use think\Model;
class User extends Model{
protected function getCreateTimeAttr($value){
return date('Y-m-d', $value);
}
// 获取器,第二个参数的作用
protected function getUserTitleAttr($value,$data){
return $data['name'] . ':' . $data['nickname'];
}
}
//// 处理字段名为:create_time
$user = User::get(1);
// 输出 2009-02-14
echo $user->birthday;
// 输出 1234567890echo
$user->getData('create_time');
修改器
触发修改器的场景
•模型对象赋值;
•调用模型的data方法,并且第二个参数传入true;
•调用模型的save方法,并且传入数据;
•显式调用模型的setAttr方法;
•定义了该字段的自动完成;
namespace app\index\model;
use think\Model;
class User extends Model{
// 获取器
protected function getBirthdayAttr($value){
return date('Y-m-d', $value);
}
// 修改器
protected function setBirthdayAttr($value){
return strtotime($value);
}
}
自动时间
默认字段
整型(设置为true的时候使用该类型)、时间(datetime)和时间戳(timestamp)。
create_time(新增自动写入)
update_time(新增和更新自动写入)
全局使用的数据库配置
// 开启自动写入时间字段 支持设置字段类型(同前)
'auto_timestamp' => true,
// or 这样
'auto_timestamp' => 'datetime',
// 时间字段取出后的时间格式
'datetime_format' => 'Y-m-d H:i:s',
class User extends Model{
// 开启时间字段自动写入
protected $autoWriteTimestamp = true;
// 定义时间字段名
protected $createTime = 'add_time';
protected $updateTime = 'update_time';
// 开启时间字段自动写入 并设置字段类型为datetime
protected $autoWriteTimestamp = 'datetime';
// 关闭时间字段自动写入
protected $autoWriteTimestamp = false;
}
数据转换
// 默认数据集返回类型是数组
// 转成数据集对象后用toArray
$list = User::all();
if($list) {
$list = collection($list)->toArray();
}
// 模型中定义“数据集”返回类型
class User extends Model{
protected $resultSetType = 'collection';
}
$list = User::all();
// 转数组
$list = $list->toArray();
// 转Json
$list = $list->toJson();
方法 | 说明 |
---|---|
hidden | 设置隐藏的属性 |
visible | 设置输出的属性 |
append | 追加额外的(获取器)属性 |
appendRelationAttr | 追加额外的关联属性 |
模型事件
不要对一个模型数据同时使用修改器和模型事件
模型的优势:
•批量完成(修改器只能针对某个字段进行修改);
•支持判断并自动终止模型数据写入操作;
•便于统一管理模型数据操作;
<?php
namespace app\index\model;
use think\Model;
class User extends Model{
public function isValid(){
}
//回调方法的第一个参数是“当前模型对象实例”
protected static function init(){
User::event('before_insert', function ($user) {
$user->reg_ip = request()->ip();
});
User::event('before_write', function ($user) {
return $user->isValid();
});
}
}
分批处理
User::chunk(100, function ($users) use ($event) {
$count = 0;
foreach ($users as $user) {
// 用户活动报名
if ($user->age > 18) {
$user->sign($event);
$count++;
if ($count >= 300) {
// 超过300则不再接受报名
return false;
}
}
}
});