我尝试使用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)
表达式应该是一个列名。有人知道在选择中使用自定义表达式的方法吗?
答案 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',
)