如何使用knex / Bookshelfselect数据库expression式作为值

我试图执行下面的查询使用knex.js和MySql

SELECT m.id, TIME(date_created) AS `timestamp`, u.username, m.`message` FROM `messages` AS m INNER JOIN users AS u ON u.id = m.user_id WHERE m.game_id IS NULL AND m.`date_created` > DATE_SUB( CURRENT_TIMESTAMP (), INTERVAL 12 HOUR ) ORDER BY m.`date_created` ASC LIMIT 50 

为了正确的处理expression式,在DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 12 HOUR)闭包中DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 12 HOUR)根据文档,在knex中有whereRow()方法。 我试图使用select()方法

 select('messages.id', 'TIME(date_created) AS timestamp', 'users.username', 'messages.message') 

但是,knex以一种应该成为列名的方式屏蔽TIME(date_created)expression式。 有谁知道在select中使用自定义expression式的方法吗?

我没有find确切的答案在我的问题,但我find了一个解决scheme,让我前进。 我创build了使用标准Bookshelf(knex)导出的单独模型:

 var Bookshelf = require('bookshelf')(knex); module.exports.DB = Bookshelf; 

并在该模型中创build单独的方法,我可以使用DB.knex.raw()在SELECT中屏蔽数据库expression式。 所以我变得能够写在上面的查询以下面的方式:

 var DB = require('./../db').DB; var Messages = DB.Model.extend({ tableName: 'messages', hasTimestamps: false, idAttribute: 'id' }, { getMessagesHistory: function (gameId) { return this.query().select('messages.id', DB.knex.raw('TIME(date_created) AS timestamp'), 'users.username', 'messages.message') .innerJoin('users', 'messages.user_id', 'users.id') .whereRaw("messages.game_id " + (gameId == 0 ? "IS NULL" : "= " + gameId)) .andWhereRaw("messages.date_created > DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 12 HOUR)") .orderBy('messages.date_created', 'ASC') .limit(50); } } ); module.exports = Messages;