2016-04-12 2 views
2

私はそこのマニュアルに従って、どこの閉鎖などDATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 12 HOUR)での適切な取り扱い式のknex.jsとMySQL使用して値としてDBの式を選択する方法knex /本棚

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 

を使用して、次のクエリを実行しようとしていますknexのwhereRow()メソッドです。 は、私が列名であることをそれが必要な方法で

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

しかしknexマスクTIME(date_created)式としてselect()メソッドを使用しようとしました。誰かがselectでカスタム式を使用する方法を知っていますか?

答えて

1

私の質問に正確な答えが見つかりませんでしたが、私は前進するための解決策を見出しました。私は、標準本棚(knex)輸出を使用して別のモデル作成:

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

をそして、私はSELECTでDB表現をマスキングするためDB.knex.raw()を使用することができ、そのモデルに別のメソッドを作成しました。そこで、私は上記のクエリを次のように書くことができました:

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; 
関連する問題