query() {
      return Helpers.query(this, Array.from(arguments));
    }
The `query` method is used to tap into the underlying Knex query builder
instance for the current model. If called with no arguments, it will
return the query builder directly. Otherwise, it will call the specified
method on the query builder, applying any additional arguments from the
`model.query` call. If the method argument is a function, it will be
called with the Knex query builder as the context and the first argument,
returning the current model.

@example

model
  .query('where', 'other_id', '=', '5')
  .fetch()
  .then(function(model) {
    // ...
  });

model
  .query({where: {other_id: '5'}, orWhere: {key: 'value'}})
  .fetch()
  .then(function(model) {
    // ...
  });

model.query(function(qb) {
  qb.where('other_person', 'LIKE', '%Demo').orWhere('other_id', '>', 10);
}).fetch()
  .then(function(model) {
    // ...
  });

let qb = model.query();
qb.where({id: 1}).select().then(function(resp) {
  // ...
});

@method Model#query
@param {function|Object|...string=} arguments The query method.
@returns {Model|QueryBuilder}
  Will return this model or, if called with no arguments, the underlying query builder.

@see {@link http://knexjs.org/#Builder Knex `QueryBuilder`}