2016-04-10 15 views
1

私はこの株式対スナップショットの1対多データモデルを持っています。Bookshelfで結合モデルを使用してモデルをフェッチする方法は?

// stock.js 
var bookshelf = require('../config'); 
var Snapshot = require('./snapshot'); 

var Stock = bookshelf.Model.extend({ 
    tableName: 'stocks', 
    hasTimestamps: true, 

    snapshots: function() { 
    return this.hasMany(Snapshot); 
    } 
}); 
module.exports = bookshelf.model('Stock', Stock); 

各ストックには多くのデータスナップショットがあります。証券belongsToのスナップショット:しかし

var bookshelf = require('../config'); 
var Stock = require('./stock'); 
var Snapshot = bookshelf.Model.extend({ 
    tableName: 'snapshots', 
    hasTimestamps: true, 

    stock: function() { 
    return this.belongsTo(Stock); 
    } 
}); 
module.exports = bookshelf.model('Snapshot', Snapshot); 

、私はこのような在庫から複数のスナップショットを取得しよう:

{ method: 'select', 
    options: {}, 
    bindings: [], 
    sql: 'select "stocks".* from "stocks"' } 
{ method: 'select', 
    options: {}, 
    bindings: [ 1 ], 
    sql: 'select "snapshots".* from "snapshots" where "snapshots"."stock_id" in (?)' } 
[ { id: 1, 
    name: '...', 
    symbol: '...', 
    created_at: 1460285493918, 
    updated_at: 1460285493918, 
    snapshots: [] } ] 

// report stock 
var bookshelf = require('./config'); 

var Stock = require('./models/stock'); 
var Snapshot = require('./models/snapshot'); 
var Promise = require("bluebird"); 

Stock.fetchAll({ 
    withRelated: ['snapshots'], 
    debug: true 
}) 
.then(function(collection) { 
    return collection.mapThen(function(model) { 
     return model.toJSON(); 
    }) 
}) 
.then(function(results) { 
    console.log(results); 
}) 
.finally(function(r) { 
    return bookshelf.knex.destroy(); 
}) 
.catch(function(e) { 
    console.log(e); 
}); 

私は、任意のスナップショットが表示されませんスナップショットとjoinというクエリが表示されます。ただし、スナップショット配列は空です。何が欠けていますか?

ありがとうございます!

答えて

3

bookshelf.plugin("registry")を使用している場合は、relationsを文字列名でリンクする必要があります。

var bookshelf = require('../config') 

var Stock = bookshelf.model('Stock', { 

    tableName: 'stocks', 

    hasTimestamps: true, 

    snapshots: function() { 

    return this.hasMany('Snapshot') 
    } 
}) 

var Snapshot = bookshelf.model('Snapshot', { 

    tableName: 'snapshots', 

    hasTimestamps: true, 

    stock: function() { 

    return this.belongsTo('Stock') 
    } 
}) 
+0

うーん..私はここにしようと、少なくともコード例では、関連付けをフェッチていないようです:https://github.com/mulderp/stock_tracker – poseid

+1

'bookshelf.model'は3つの引数を取ります。 'ModelName'、' protoProps'、 'staticProps'です。あなたの例は、 'ModelName'と' Model'コンストラクタを渡しています。 'bookshelf.Model.extend'を使って' Model'を作るのではなく、 'bookshelf.model'を使ってください。 – thebearingedge

+0

ありがとう!できます! PRもありがとう! – poseid

関連する問題