THINKPHP5 模型使用歷程(三)

秦曉武發表於2020-12-04

全域性定義

通用的功能,直接在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 協議》,轉載必須註明作者和本文連結

相關文章