2016-04-12 37 views
2

orada belgelere göre nerede kapatma gibi DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 12 HOUR) düzgün elleçleme ifadeler için knex.js ve MySQLkullanarak değer olarak DB Expression nasıl seçilir knex/Kitaplık

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 

kullanarak aşağıdaki sorguyu yürütmek çalışıyorum knex'te whereRow() yöntemidir. Bir sütun adı olarak olması gerektiği şekilde

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

Ama knex maskeleri olarak TIME(date_created) ifadesini seçin() yöntemini kullanmaya çalıştı. Seçimlerdeki özel ifadeleri kullanmanın bir yolu var mı?

cevap

1

Sorumu tam olarak bulamadım ama ilerlememi sağlayan bir çözüm buldum. Ben standart Kitaplık (knex) ihracat kullanan ayrı bir model yarattı:

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

Ve SELECT DB ifadeleri maskeleme için DB.knex.raw() kullanabileceği modelinde ayrı yöntem yarattı. Bu yüzden yukarıdaki sorguyu aşağıdaki şekilde yazabildim:

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; 
İlgili konular