2021SC@SDUSC
此方法用于新增或更新一个属性。
此方法有两个参数:第一个参数 data 为需要进行操作的属性; 第二个参数 create 是一个布尔类型的值,create 为 true 表示需要对属性的内容进行操作,create 为 false 表示仅更新属性的更新时间。
首先获取数据对象。若 data 为空,方法无法执行,返回 false。
判断 data.id 是否为空。若为 data.id 空,表示该属性为新增属性,将属性建立时间设为当前时间,属性状态设为1,把属性添加进去并获取到属性 id 。 若 id 不为正,表示属性添加失败,方法返回布尔值 false。若 create 不为 true,方法执行成功,方法结束;若 create 为 true,在表中新增该属性,并获取方法 addField() 的返回值,赋值给 res 。若 res 为 false ,表示添加失败,删除属性的 id ,方法返回布尔值 false,方法结束。若 res 为 true,方法执行成功,方法结束。
若 data.id 不为空,表示该属性为需要更新的属性。若 create 不为 true ,更新属性的更新时间,方法结束。若 create 为 true ,更新表字段,然后更新属性的更新时间,方法结束。
async upattr(data, create) {
if (think.isEmpty(data)) {
return false;
}
if (think.isEmpty(data.id)) {
data.create_time = new Date().valueOf();
data.status = 1;
const id = await this.add(data);
if (!id) {
return false;
}
if (create) {
const res = await this.addField(data);
console.log(res);
// return false;
if (!res) {
this.delete(id);
return false;
}
}
} else {
if (create) {
const res = await this.updateField(data);
}
data.update_time = new Date().valueOf();
const status = await this.update(data);
}
return data;
}
此方法用于检查当前表是否存在。
此方法仅有一个参数 model_id ,为模型id。
首先实例化 model。在数据库中查找 id 为 model_id 、属性包括 name 和 extend 的单条数据,赋值给 model。
依据 model.extend 的值判断模型是否为独立模型,从而获取模型表名 table_name 。
在数据库 mysql 中查找名字为 table_name 的表,赋值给 res 。res 的 length 即为表的数量。由于建表时我们会对表的名字进行查重处理,换言之不会出现两个名字相同而内容不同的表,而所以res 的 length 为 0 时表示表不存在,不为 0 时表示表存在。
async checkTableExist(model_id) {
let table_name;
let extend_model;
const Model = this.model('model');
const model = await Model.where({id: model_id}).field('name,extend').find();
if (model.extend == 0) {
table_name = this.table_name = think.config('model.mysql.prefix') + model.name.toLowerCase();
} else {
extend_model = await Model.where({id: model.extend}).field('name,extend').find();
table_name = this.table_name = think.config('model.mysql.prefix') + extend_model.name.toLowerCase() + '_' + model.name.toLowerCase();
}
const res = await this.model('mysql').query(`SHOW TABLES LIKE '${table_name}'`);
return res.length;
}
此方法用于初始化独立模型表结构。
此方法仅有一个参数 mod_id ,为模型id。
async addtable(mod_id) {
const table_exist = await this.checkTableExist(mod_id);
let sql;
if (!table_exist) {
const model_info = await this.model('model').where({id: mod_id}).field('engine_type,need_pk').find();
console.log(model_info);
if (model_info.need_pk) {
sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` (
\`id\` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键' ,
\`title\` char(80) NOT NULL COMMENT '标题',
\`category_id\` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '栏目目录',
\`group_id\` smallint(3) unsigned NOT NULL DEFAULT '0' COMMENT '所属分组',
\`model_id\` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '内容模型ID',
\`create_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
\`update_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
\`status\` tinyint(4) NOT NULL DEFAULT '0' COMMENT '数据状态0禁用,1启用,-1删除',
\`sort_id\` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '分类信息关联id',
PRIMARY KEY (\`id\`),
KEY \`category_id\` (\`category_id\`),
KEY \`group_id\` (\`group_id\`),
KEY \`status\` (\`status\`),
KEY \`sort_id\` (\`sort_id\`)
)
ENGINE=${model_info.engine_type}
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;`;
sql = this.parseSql(sql);
} else {
sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` (
\`title\` char(80) NOT NULL COMMENT '标题',
\`category_id\` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '栏目目录',
\`group_id\` smallint(3) unsigned NOT NULL DEFAULT '0' COMMENT '所属分组',
\`model_id\` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '内容模型ID',
\`create_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
\`update_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
\`status\` tinyint(4) NOT NULL DEFAULT '0' COMMENT '数据状态0禁用,1启用,-1删除',
\`sort_id\` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '分类信息关联id',
KEY \`category_id\` (\`category_id\`),
KEY \`group_id\` (\`group_id\`),
KEY \`status\` (\`status\`),
KEY \`sort_id\` (\`sort_id\`)
)
ENGINE=${model_info.engine_type}
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;`;
sql = this.parseSql(sql);
}
const res = await this.model('mysql').execute(sql);
return res >= 0;
}else{
return 0;
}
}