У меня есть простой 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() {}
};
}