我一直在做很多操作,我希望有一种方法可以“扩展”knex以便能够做到。
我想要像:
oneExists
result = knex.count(id).from('table').where({'code': 25})
if (result.length === 0) return false
if (result.length === 1) return true
throw an error
我希望能够做类似
的事情knex.oneExists.count('id').from('table').where({'code': 25}).
目前我正在写这样的代码:
KnexUtil.oneExists(knex.select('id').from('table').where({code: 25}))
返回一个承诺
我查看了knex代码库,我不确定:
答案 0 :(得分:2)
当然可以。我建议只创建自己的插件,如下所示:
// my-plugin.js
'use strict';
module.exports = function (Bookshelf) {
Bookshelf.Model = Bookshelf.Model.extend({
foo: function ( bar ) {
if( bar )
console.log('Method foo was called on a model with the arguments:', arguments.join(', '));
}
});
Bookshelf.Collection = Bookshelf.Collection.extend({
foo: function ( bar ) {
if( bar )
console.log('Method foo was called on a collection with the arguments:', arguments.join(', '));
}
});
};
然后在主应用程序文件中添加:
Bookshelf.plugin( require( './my-plugin' ) );
BookshelfJS插件基本上允许您扩展模型和集合(以及更多),这允许您添加自己的方法,或覆盖现有方法(同时仍然能够从插件中调用原始方法)
为了更好地理解,您可能会在plugins directory内查看一些现有的BookshelfJS插件,其中一些已经附带书架。
另一个可能更好地了解插件工作方式的插件是Soft Delete Plugin。在该插件中,您可以看到一些BookshelfJS方法在模型和集合对象中是如何被覆盖的,方法是执行方法的原始版本,然后返回解析/修改的结果(Lines #37-#59和{{3 }},以及添加全新的方法(Lines #37-#57)
编辑:显然这比KnexJS更多是BookshelfJS,但我没有看到为KnexJS创建插件的任何方法,因为它只是一个查询构造函数,所有真实的魔法在ORM中
答案 1 :(得分:2)
从v0.19.1开始,knex具有扩展QueryBuilder的内置功能
import Knex from 'knex'
Knex.QueryBuilder.extend('someFn', function (arg) {
console.log('Do Smth', arg)
return this
})
const knex = Knex({ client: 'pg' })
knex.select().from('table').someFn(0).toString()
答案 2 :(得分:0)
https://github.com/tgriesser/knex/issues/1158
中对此进行了讨论 knex
并不支持这一点,但是一个hacky方法就是使用你的函数来修补knex查询构建器:
var knex = require('knex')({client: 'pg'});
knex.client.QueryBuilder.prototype.newFunc = function () {
console.log("New query builder function");
return this;
}
knex('table').newFunc().toString();
// outputs:
// New query builder function
// 'select * from "table"'