Удалите функцию после первого использования - PullRequest
0 голосов
/ 25 марта 2020

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

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Вместо this можно вернуть указатель c method, который может быть вызван в цепочке после этого метода.

Пример:

class QueryBuilder {
  select(fields) {
    this.query = "SELECT `" + fields.join("`, `") + "` ";
    return {
      from: this.from.bind(this)
    };
  }
  from(table) {
    this.query += "FROM `" + table + "` ";
    return {
      where : ""
    };
  }
}
0 голосов
/ 25 марта 2020

Вы можете попробовать следующие модификации:

select(fields) {
    if(!this.query.includes("SELECT")){
       this.query = "SELECT `" + fields.join("`, `") + "` ";
    }
    return this;
  }
...