我有一个简单的SQL查询生成器,如下所示:
class QueryBuilder {
select(fields) {
this.query = "SELECT `" + fields.join("`, `") + "` ";
return this;
}
from(table) {
this.query += "FROM `" + table + "` ";
return this;
}
}
问题是它返回
this
,所以我可以这样做:const sql = builder.select("field1", "field2").from("table").select("I shouldn't be able to call select");
有什么方法可以从
select
实例中禁用/删除Builder
函数,并在首次调用后自动完成?或者强调,第二次调用该函数将导致错误。解:
根据@Sohail答案,要使其像这样工作,您只需将
from()
从QueryBuilder
类中移出,然后将其作为字段返回,并将查询作为新的普通对象返回:class QueryBuilder {
static select(fields) {
this.query = "SELECT `" + fields.join("`, `") + "` ";
return {
query: this.query,
from
};
}
}
function from(table) {
this.query += "FROM `" + table + "` ";
return {
query: this.query,
where: function() {}
};
}
最佳答案
您可以返回特定的method
而不是this
,该方法可以在链中调用。
例:
class QueryBuilder {
select(fields) {
this.query = "SELECT `" + fields.join("`, `") + "` ";
return {
from: this.from.bind(this)
};
}
from(table) {
this.query += "FROM `" + table + "` ";
return {
where : ""
};
}
}