如何使用knex / Bookshelf选择DB Expression作为值

时间:2016-04-12 08:56:36

标签: mysql node.js express bookshelf.js knex.js

我尝试使用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

根据文档中关于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)表达式应该是一个列名。有人知道在选择中使用自定义表达式的方法吗?

2 个答案:

答案 0 :(得分:1)

我没有在我的问题上找到确切的答案,但我找到了一个允许我继续前进的解决方案。我创建了使用标准 Bookshelf(knex)导出的单独模型:

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

在该模型中创建了单独的方法,我可以使用DB.knex.raw()来掩盖SELECT中的DB表达式。所以我能够通过以下方式编写上面的查询:

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;

答案 1 :(得分:0)

您可以用 knex.raw() 包裹任何参数以告诉框架它是原始 SQL 片段:

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

http://knexjs.org/#Raw-Bindings

相关问题