【问题标题】:How to select DB Expression as value using knex/Bookshelf如何使用 knex/Bookshelf 选择 DB 表达式作为值
【发布时间】:2016-08-02 18:29:30
【问题描述】:

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

根据文档,为了正确处理 where 闭包中的表达式,例如 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) 表达式。有人知道在选择中使用自定义表达式的方法吗?

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-15
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多