// +---------------------------------------------------------------------- namespace ywxapp\model; /** * Email 类 * * @author ywxapp */ class CommonEmail extends BaseModel{ // 设置表名(think-orm 4.0:name 不带前缀,自动拼 wxapp_) protected function getOptions(): array { return [ 'strict' => false, 'autoWriteTimestamp' => 'int', 'createTime' => 'create_at', 'updateTime' => 'update_at', 'deleteTime' => 'delete_at', 'defaultSoftDelete' => 0, 'append' => ['target'], 'hidden' => ['create_at', 'update_at', 'delete_at'], 'readonly' => ['id'], ]; } /** * 建表语句:common_email 未被 public/install/install.sql 收录, * 而 Email 库(发码/校验/清理)运行时依赖它,故在此自带 DDL 兜底。 */ private const TABLE_DDL = <<<'SQL' CREATE TABLE IF NOT EXISTS `__PREFIX__common_email` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `event` varchar(50) NOT NULL DEFAULT '' COMMENT '事件标识', `email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱地址', `code` varchar(20) NOT NULL DEFAULT '' COMMENT '验证码', `ip` varchar(45) NOT NULL DEFAULT '' COMMENT '请求IP', `create_at` int unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', `update_at` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', `delete_at` int unsigned NOT NULL DEFAULT '0' COMMENT '软删时间', PRIMARY KEY (`id`), KEY `idx_email_event` (`email`,`event`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='邮箱验证码表' SQL; /** * 运行时自愈:确保 common_email 表存在。 * 优先 install.sql(将来若补录则以事实源为准),缺失则用内置 DDL。 */ public static function ensureSchema(): void { $prefix = BaseModel::currentPrefix(); BaseModel::ensureTableFromInstall($prefix, 'common_email'); $table = $prefix . 'common_email'; if (! BaseModel::tableExists($table)) { BaseModel::ensureTable($table, str_replace('__PREFIX__', $prefix, self::TABLE_DDL)); } } /** * 提前自愈:common_email 不在 install.sql 中,必须在 think-orm 读取表结构 * (parent::__construct 内会触发 getTableInfo)之前先把表补上,否则报 1146。 */ public function __construct(array $data = []) { self::ensureSchema(); parent::__construct($data); } protected function initialize() { parent::initialize(); self::ensureSchema(); } }