think.model.base
繼承自 think.base 類。
export default class extends think.model.base {
getList(){
}
}
module.exports = think.model({
getList: function(){
}
})
數(shù)據(jù)表主鍵,默認(rèn)為id
。
模型名,默認(rèn)從當(dāng)前文件名中解析。
當(dāng)前文件路徑為 for/bar/app/home/model/user.js,那么解析的模型名為user
。
數(shù)據(jù)表名稱前綴,默認(rèn)為think_
。
數(shù)據(jù)表名稱,不包含前綴。默認(rèn)等于模型名。
數(shù)據(jù)表字段,默認(rèn)自動(dòng)從數(shù)據(jù)表分析。
數(shù)據(jù)表索引,默認(rèn)自動(dòng)從數(shù)據(jù)表分析。
配置,實(shí)例化的時(shí)候指定。
連接數(shù)據(jù)庫(kù)句柄。
操作的數(shù)據(jù)。
操作選項(xiàng)。
name
{String} 模型名稱options
{Object} 配置項(xiàng)module
{String} 模塊名return
{Object}獲取模型實(shí)例,可以跨模塊獲取。
export default class extends think.model.base {
* getList(){
//獲取 user 模型實(shí)例
let instance = this.model("user");
let list = yield instance.select();
let ids = list.map(item => {
return item.id;
});
let data = yield this.where({id: ["IN", ids]}).select();
return data;
}
}
return
{string}獲取表名前綴。
return
{String}獲取配置對(duì)應(yīng)的 key,緩存 db 句柄時(shí)使用。
return
{Object}根據(jù)當(dāng)前的配置獲取 db 實(shí)例,如果已經(jīng)存在則直接返回。
return
{String} 模型名稱如果已經(jīng)配置則直接返回,否則解析當(dāng)前的文件名。
return
{String} 獲取表名,包含表前綴獲取表名,包含表前綴。
key
{String} 緩存 keytimeout
{Number} 緩存有效時(shí)間,單位為秒return
{this}設(shè)置緩存選項(xiàng)。
export default class extends think.model.base {
getList(){
return this.cache("getList", 1000).where({id: {">": 100}}).select();
}
}
export default class extends think.model.base {
getList(){
return this.cache(1000).where({id: {">": 100}}).select();
}
}
export default class extends think.model.base {
getList(){
return this.cache({
key: "getList",
timeout: 1000,
type: "file" //使用文件方式緩存
}).where({id: {">": 100}}).select();
}
}
offset
{Number} 設(shè)置查詢的起始位置length
{Number} 設(shè)置查詢的數(shù)據(jù)長(zhǎng)度return
{this}設(shè)置查詢結(jié)果的限制條件。
export default class extends think.model.base {
getList(){
//查詢20條數(shù)據(jù)
return this.limit(20).where({id: {">": 100}}).select();
}
}
export default class extends think.model.base {
getList(){
//從起始位置100開始查詢20調(diào)數(shù)據(jù)
return this.limit(100, 20).where({id: {">": 100}}).select();
}
}
page
{Number} 當(dāng)前頁(yè),從 1 開始listRows
{Number} 每頁(yè)的條數(shù)return
{this}設(shè)置查詢分頁(yè)數(shù)據(jù),自動(dòng)轉(zhuǎn)化為 limit
數(shù)據(jù)。
export default class extends think.model.base {
getList(){
//查詢第 2 頁(yè)數(shù)據(jù),每頁(yè) 10 條數(shù)據(jù)
return this.page(2, 10).where({id: {">": 100}}).select();
}
}
where
{String | Object} where 條件return
{this}設(shè)置 where 查詢條件??梢酝ㄟ^屬性 _logic
設(shè)置邏輯,默認(rèn)為 AND
??梢酝ㄟ^屬性 _complex
設(shè)置復(fù)合查詢。
注:
1、以下示例不適合 mongo model,mongo 中設(shè)置 where 條件請(qǐng)見 model.mongo 里的 where 條件設(shè)定。2、where 條件中的值需要在 Logic 里做數(shù)據(jù)校驗(yàn),否則可能會(huì)有漏洞。
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user`
return this.where().select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 )
return this.where({id: 10}).select();
}
where3(){
//SELECT * FROM `think_user` WHERE ( id = 10 OR id < 2 )
return this.where("id = 10 OR id < 2").select();
}
where4(){
//SELECT * FROM `think_user` WHERE ( `id` != 10 )
return this.where({id: ["!=", 10]}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` where ( title IS NULL );
return this.where({title: null}).select();
}
where2(){
//SELECT * FROM `think_user` where ( title IS NOT NULL );
return this.where({title: ["!=", null]}).select();
}
}
ThinkJS 默認(rèn)會(huì)對(duì)字段和值進(jìn)行轉(zhuǎn)義,防止安全漏洞。有時(shí)候一些特殊的情況不希望被轉(zhuǎn)義,可以使用 EXP 的方式,如:
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( (`name` ="name") )
return this.where({name: ["EXP", "=\"name\""]}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `title` NOT LIKE "welefen" )
return this.where({title: ["NOTLIKE", "welefen"]}).select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( `title` LIKE "%welefen%" )
return this.where({title: ["like", "%welefen%"]}).select();
}
//like 多個(gè)值
where3(){
//SELECT * FROM `think_user` WHERE ( (`title` LIKE "welefen" OR `title` LIKE "suredy") )
return this.where({title: ["like", ["welefen", "suredy"]]}).select();
}
//多個(gè)字段或的關(guān)系 like 一個(gè)值
where4(){
//SELECT * FROM `think_user` WHERE ( (`title` LIKE "%welefen%") OR (`content` LIKE "%welefen%") )
return this.where({"title|content": ["like", "%welefen%"]}).select();
}
//多個(gè)字段與的關(guān)系 Like 一個(gè)值
where5(){
//SELECT * FROM `think_user` WHERE ( (`title` LIKE "%welefen%") AND (`content` LIKE "%welefen%") )
return this.where({"title&content": ["like", "%welefen%"]}).select();
}
}
export default class extens think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `id` IN ("10","20") )
return this.where({id: ["IN", "10,20"]}).select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( `id` IN (10,20) )
return this.where({id: ["IN", [10, 20]]}).select();
}
where3(){
//SELECT * FROM `think_user` WHERE ( `id` NOT IN (10,20) )
return this.where({id: ["NOTIN", [10, 20]]}).select();
}
}
export default class extens think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( (`id` BETWEEN 1 AND 2) )
return this.where({id: ["BETWEEN", 1, 2]}).select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( (`id` BETWEEN "1" AND "2") )
return this.where({id: ["between", "1,2"]}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 ) AND ( `title` = "www" )
return this.where({id: 10, title: "www"}).select();
}
//修改邏輯為 OR
where2(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 ) OR ( `title` = "www" )
return this.where({id: 10, title: "www", _logic: "OR"}).select();
}
//修改邏輯為 XOR
where2(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 ) XOR ( `title` = "www" )
return this.where({id: 10, title: "www", _logic: "XOR"}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `id` > 10 AND `id` < 20 )
return this.where({id: {">": 10, "<": 20}}).select();
}
//修改邏輯為 OR
where2(){
//SELECT * FROM `think_user` WHERE ( `id` < 10 OR `id` > 20 )
return this.where({id: {"<": 10, ">": 20, _logic: "OR"}}).select()
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `title` = "test" ) AND ( ( `id` IN (1,2,3) ) OR ( `content` = "www" ) )
return this.where({
title: "test",
_complex: {id: ["IN", [1, 2, 3]],
content: "www",
_logic: "or"
}
}).select()
}
}
field
{String | Array} 設(shè)置要查詢的字段,可以是字符串,也可以是數(shù)組return
{this}設(shè)置要查詢的字段。
export default class extends think.controller.base {
async indexAction(){
let model = this.model("user");
//設(shè)置要查詢的字符串,字符串方式,多個(gè)用逗號(hào)隔開
let data = await model.field("name,title").select();
}
}
export default class extends think.controller.base {
//字段里調(diào)用 SQL 函數(shù)
async listAction(){
let model = this.model("user");
let data = await model.field("id, INSTR(\"30,35,31,\",id + \",\") as d").select();
}
}
export default class extends think.controller.base {
async indexAction(){
let model = this.model("user");
//設(shè)置要查詢的字符串,數(shù)組方式
let data = await model.field(["name","title"]).select();
}
}
field
{String | Array} 反選字段,即查詢的時(shí)候不包含這些字段return
{this}設(shè)置反選字段,查詢的時(shí)候會(huì)過濾這些字段,支持字符串和數(shù)組 2 種方式。
table
{String} 表名hasPrefix
{Boolean} 是否已經(jīng)有了表前綴,如果 table 值含有空格,則不在添加表前綴return
{this}設(shè)置表名,可以將一個(gè) SQL 語(yǔ)句設(shè)置為表名。
export default class extends think.model.base {
getList(){
return this.table("test", true).select();
}
}
export default class extends think.model.base {
async getList(){
let sql = await this.model("group").group("name").buildSql();
let data = await this.table(sql).select();
return data;
}
}
union
{String | Object} 聯(lián)合查詢 SQL 或者表名all
{Boolean} 是否是 UNION ALL 方式return
{this}聯(lián)合查詢。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` UNION (SELECT * FROM think_pic2)
return this.union("SELECT * FROM think_pic2").select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` UNION ALL (SELECT * FROM `think_pic2`)
return this.union({table: "think_pic2"}, true).select();
}
}
join
{String | Object | Array} 要組合的查詢語(yǔ)句,默認(rèn)為 LEFT JOIN
return
{this}組合查詢,支持字符串、數(shù)組和對(duì)象等多種方式。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN think_cate ON think_group.cate_id=think_cate.id
return this.join("think_cate ON think_group.cate_id=think_cate.id").select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN think_cate ON think_group.cate_id=think_cate.id RIGHT JOIN think_tag ON think_group.tag_id=think_tag.id
return this.join([
"think_cate ON think_group.cate_id=think_cate.id",
"RIGHT JOIN think_tag ON think_group.tag_id=think_tag.id"
]).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` INNER JOIN `think_cate` AS c ON think_user.`cate_id`=c.`id`
return this.join({
table: "cate",
join: "inner", //join 方式,有 left, right, inner 3 種方式
as: "c", // 表別名
on: ["cate_id", "id"] //ON 條件
}).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM think_user AS a LEFT JOIN `think_cate` AS c ON a.`cate_id`=c.`id` LEFT JOIN `think_group_tag` AS d ON a.`id`=d.`group_id`
return this.alias("a").join({
table: "cate",
join: "left",
as: "c",
on: ["cate_id", "id"]
}).join({
table: "group_tag",
join: "left",
as: "d",
on: ["id", "group_id"]
}).select()
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN `think_cate` ON think_user.`id`=think_cate.`id` LEFT JOIN `think_group_tag` ON think_user.`id`=think_group_tag.`group_id`
return this.join({
cate: {
on: ["id", "id"]
},
group_tag: {
on: ["id", "group_id"]
}
}).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM think_user AS a LEFT JOIN `think_cate` AS c ON a.`id`=c.`id` LEFT JOIN `think_group_tag` AS d ON a.`id`=d.`group_id`
return this.alias("a").join({
cate: {
join: "left", // 有 left,right,inner 3 個(gè)值
as: "c",
on: ["id", "id"]
},
group_tag: {
join: "left",
as: "d",
on: ["id", "group_id"]
}
}).select()
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN `think_cate` ON think_user.`id`=think_cate.`id` LEFT JOIN `think_group_tag` ON think_user.`id`=think_group_tag.`group_id` LEFT JOIN `think_tag` ON (think_user.`id`=think_tag.`id` AND think_user.`title`=think_tag.`name`)
return this.join({
cate: {on: "id, id"},
group_tag: {on: ["id", "group_id"]},
tag: {
on: { // 多個(gè)字段的 ON
id: "id",
title: "name"
}
}
}).select()
}
}
export default class extends think.model.base {
async getList(){
let sql = await this.model("group").buildSql();
//SELECT * FROM `think_user` LEFT JOIN ( SELECT * FROM `think_group` ) ON think_user.`gid`=( SELECT * FROM `think_group` ).`id`
return this.join({
table: sql,
on: ["gid", "id"]
}).select();
}
}
order
{String | Array | Object} 排序方式return
{this}設(shè)置排序方式。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` ORDER BY id DESC, name ASC
return this.order("id DESC, name ASC").select();
}
getList1(){
//SELECT * FROM `think_user` ORDER BY count(num) DESC
return this.order("count(num) DESC").select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` ORDER BY id DESC,name ASC
return this.order(["id DESC", "name ASC"]).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` ORDER BY `id` DESC,`name` ASC
return this.order({
id: "DESC",
name: "ASC"
}).select();
}
}
tableAlias
{String} 表別名return
{this}設(shè)置表別名。
export default class extends think.model.base {
getList(){
//SELECT * FROM think_user AS a;
return this.alias("a").select();
}
}
having
{String} having 查詢的字符串return
{this}設(shè)置 having 查詢。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` HAVING view_nums > 1000 AND view_nums < 2000
return this.having("view_nums > 1000 AND view_nums < 2000").select();
}
}
group
{String} 分組查詢的字段return
{this}設(shè)定分組查詢。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` GROUP BY `name`
return this.group("name").select();
}
}
distinct
{String} 去重的字段return
{this}去重查詢。
export default class extends think.model.base {
getList(){
//SELECT DISTINCT `name` FROM `think_user`
return this.distinct("name").select();
}
}
explain
{Boolean} 是否添加 explain 執(zhí)行return
{this}是否在 SQL 之前添加 explain 執(zhí)行,用來查看 SQL 的性能。
操作選項(xiàng)過濾。
data
{Object | Array} 要操作的數(shù)據(jù)數(shù)據(jù)過濾。
data
{Object} 要添加的數(shù)據(jù)添加前置操作。
data
{Object} 要添加的數(shù)據(jù)添加后置操作。
刪除后置操作。
data
{Object} 要更新的數(shù)據(jù)更新前置操作。
data
{Object} 要更新的數(shù)據(jù)更新后置操作。
data
{Object} 查詢的單條數(shù)據(jù)return
{Object | Promise}find
查詢后置操作。
data
[Array] 查詢的數(shù)據(jù)數(shù)據(jù)return
{Array | Promise}select
查詢后置操作。
data
{Object}添加和更新操作時(shí)設(shè)置操作的數(shù)據(jù)。
options
{Object}設(shè)置操作選項(xiàng)。如:
export default class extends think.model.base {
getList(){
return this.options({
where: "id = 1",
limit: [10, 1]
}).select();
}
}
關(guān)于數(shù)據(jù)庫(kù)連接,一般情況下不要直接調(diào)用。
table
{String} 表名return
{Promise}獲取表的字段信息,自動(dòng)從數(shù)據(jù)庫(kù)中讀取。
return
{String}獲取最后執(zhí)行的 SQL 語(yǔ)句。
return
{Promise}將當(dāng)前的查詢條件生成一個(gè) SQL 語(yǔ)句。
oriOpts
{Object}extraOptions
{Object}return
{Promise}根據(jù)已經(jīng)設(shè)定的一些條件解析當(dāng)前的操作選項(xiàng)。
return
{Promise}返回 pk
的值,返回一個(gè) Promise。
field
{String} 數(shù)據(jù)表中的字段名稱value
{Mixed}return
{Mixed}根據(jù)數(shù)據(jù)表中的字段類型解析 value。
data
{Object} 要解析的數(shù)據(jù)return
{Object}調(diào)用 parseType
方法解析數(shù)據(jù)。
data
{Object} 要添加的數(shù)據(jù)options
{Object} 操作選項(xiàng)replace
{Boolean} 是否是替換操作return
{Promise} 返回插入的 ID添加一條數(shù)據(jù)。
data
{Object} 要添加的數(shù)據(jù)where
{Object} where 條件return
{Promise}當(dāng) where 條件未命中到任何數(shù)據(jù)時(shí)才添加數(shù)據(jù)。
dataList
{Array} 要添加的數(shù)據(jù)列表options
{Object} 操作選項(xiàng)replace
{Boolean} 是否是替換操作return
{Promise} 返回插入的 ID一次添加多條數(shù)據(jù)。
options
{Object} 操作選項(xiàng)return
{Promise} 返回影響的行數(shù)刪除數(shù)據(jù)。
data
{Object} 要更新的數(shù)據(jù)options
{Object} 操作選項(xiàng)return
{Promise} 返回影響的行數(shù)更新數(shù)據(jù)。
dataList
{Array} 要更新的數(shù)據(jù)列表options
{Object} 操作選項(xiàng)return
{Promise}更新多條數(shù)據(jù),dataList 里必須包含主鍵的值,會(huì)自動(dòng)設(shè)置為更新條件。
field
{String} 字段名step
{Number} 增加的值,默認(rèn)為 1return
{Promise}字段值增加。
field
{String} 字段名step
{Number} 增加的值,默認(rèn)為 1return
{Promise}字段值減少。
options
{Object} 操作選項(xiàng)return
{Promise} 返回單條數(shù)據(jù)查詢單條數(shù)據(jù),返回的數(shù)據(jù)類型為對(duì)象。如果未查詢到相關(guān)數(shù)據(jù),返回值為 {}
。
options
{Object} 操作選項(xiàng)return
{Promise} 返回多條數(shù)據(jù)查詢單條數(shù)據(jù),返回的數(shù)據(jù)類型為數(shù)組。如果未查詢到相關(guān)數(shù)據(jù),返回值為 []
。
options
{Object} 操作選項(xiàng)pageFlag
{Boolean} 當(dāng)頁(yè)數(shù)不合法時(shí)處理,true 為修正到第一頁(yè),false 為修正到最后一頁(yè),默認(rèn)不修正return
{Promise}分頁(yè)查詢,一般需要結(jié)合 page
方法一起使用。如:
export default class extends think.controller.base {
async listAction(){
let model = this.model("user");
let data = await model.page(this.get("page")).countSelect();
}
}
返回值數(shù)據(jù)結(jié)構(gòu)如下:
{
numsPerPage: 10, //每頁(yè)顯示的條數(shù)
currentPage: 1, //當(dāng)前頁(yè)
count: 100, //總條數(shù)
totalPages: 10, //總頁(yè)數(shù)
data: [{ //當(dāng)前頁(yè)下的數(shù)據(jù)列表
name: "thinkjs",
email: "admin@thinkjs.org"
}, ...]
}
field
{String} 字段名,多個(gè)字段用逗號(hào)隔開one
{Boolean | Number} 獲取的條數(shù)return
{Promise}獲取特定字段的值。
field
{String} 字段名return
{Promise} 返回總條數(shù)獲取總條數(shù)。
field
{String} 字段名return
{Promise}對(duì)字段值進(jìn)行求和。
field
{String} 字段名return
{Promise}求字段的最小值。
field
{String} 字段名return
{Promise}求字段的最大值。
field
{String} 字段名return
{Promise}求字段的平均值。
return
{Promise}指定 SQL 語(yǔ)句執(zhí)行查詢。
return
{Promise}執(zhí)行 SQL 語(yǔ)句。
sql
{String} 要解析的 SQL 語(yǔ)句return
{String}解析 SQL 語(yǔ)句,調(diào)用 util.format
方法解析 SQL 語(yǔ)句,并將 SQL 語(yǔ)句中的 __TABLENAME__
解析為對(duì)應(yīng)的表名。
export default class extends think.model.base {
getSql(){
let sql = "SELECT * FROM __GROUP__ WHERE id=%d";
sql = this.parseSql(sql, 10);
//sql is SELECT * FROM think_group WHERE id=10
}
}
return
{Promise}開啟事務(wù)。
return
{Promise}提交事務(wù)。
return
{Promise}回滾事務(wù)。
fn
{Function} 要執(zhí)行的函數(shù)return
{Promise}使用事務(wù)來執(zhí)行傳遞的函數(shù),函數(shù)要返回 Promise。
export default class extends think.model.base {
updateData(data){
return this.transaction(async () => {
let insertId = await this.add(data);
let result = await this.model("user_cate").add({user_id: insertId, cate_id: 100});
return result;
})
}
}
文檔地址:https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_model.md
更多建議: