ThinkPHP 5 模型使用历程 - 全局定义

通用的功能,直接在Base里定义,有以下几种:

属性定义

class MTBase extends Model
{
    /**
     * @var string 时间类型
     */
    protected $autoWriteTimestamp = 'datetime';
    /**
     * @var string 时间格式化
     */
    protected $dateFormat = 'Y-m-d H:i:s';
    /**
     * @var string 设置返回数据集的对象名
     */
    protected $resultSetType = 'collection';
}

获取器

class MTBase extends Model
{
    /**
     * 字段转换 * * @param null $value 默认是NULL
     * @param array $data 查询结果数据
     *
     * @return string 转换后值
     */
    public function getTypeTextAttr($value, $data)
    {
        if ($value) {
            return $value;
        }
        if (!isset($data['type'])) {
            return $value ?? '';
        }
        return LTMapField::valueToText($this->table, 'type', $data['type']);
    }
}

缓存

class MTBase extends Model
{
    /**
     * 生成列表缓存
     *
     * @param array $map 查询条件
     * @param string $key 数组键值对应字段
     *
     * @return array
     */
    public static function getCacheList($map = [], $key = 'id')
    {
        $args = json_encode(func_get_args(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $file_name = md5(static::class . '_' . __FUNCTION__ . '_' . $args);
        return FCache::tagRemember(static::class, $file_name, function () use ($map, $key) {
            $model = new static();
            $list = $model->where($map ?: [['status', '<', 9999]])->order('sort desc')->select();
            $result = [];
            /** @var MTBase $row */
            foreach ($list as $row) {
                $result[$row->$key] = $row->toArray();
            }
            return $result;
        });
    }
}

观察者

class MTBase extends Model
{
    /**
     * 注册事件
     */
    protected static function init()
    {
        //自动加载观察者类
        $event_class = str_replace('model\table\MT', 'model\event\ME', static::class);
        /* 匹配到了 */
        if ($event_class != static::class) {
            if (class_exists($event_class)) {
                static::observe($event_class);
            } else {
                static::observe(MEBase::class);
            }
        } else {
            static::observe(MEBase::class);
        }
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
秦晓武
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!