我有一个简单的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 : ""
    };
  }
}

10-04 14:07