ThinkPHP5 模型数据处理

获取器


//// 定义
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;
            }
        }
    }
});
发布了37 篇原创文章 · 获赞 1 · 访问量 763

猜你喜欢

转载自blog.csdn.net/yuhezheg/article/details/103420724