2016-05-06 6 views
0

関連モデルから属性を取得する際に問題があるようです。Bookshelf関連のデータ属性が空です

モデル:

// DB = export of Bookshelf 

// Signup model 
var DB = require('../db').DB; 
var UserMeta = require('./usersmeta'); 

var Signup = DB.Model.extend({ 
    tableName: 'tblSignups', 
    idAttribute: 'id', 
    hasTimestamps: true, 
    usermeta: function() { 
    return this.belongsTo(UserMeta); 
    } 
}); 

module.exports = Signup; 

// Usermeta model 
var DB = require('../db').DB; 
var User = require('./users'); 

var UserMeta = DB.Model.extend({ 
    tableName: 'tblUsersMeta', 
    idAttribute: 'id', 
    hasTimestamps: true, 
    user: function() { 
    return this.belongsTo(User); 
    } 
}); 

module.exports = UserMeta; 

管理申し込みルート:

router.get('/signups', function(req, res, next) { 
    model.SignUp.fetchAll({withRelated: ['usermeta']}).then(function(collection) { 
    for(var i = 0; i < collection.toArray().length; i++){ 
     console.log('Signup ' + i + '\n--------------------------'); 
     console.log(collection.toArray()[i]); 
     console.log('Related usermeta\n--------------------------'); 
     console.log(collection.toArray()[i].related('usermeta')); 
    } 
    res.render('admin/pages/signups', {title: 'signups', error: false, signups: collection.toArray()}); 
    }).catch(function(err) { 
    res.status(500).json({error: true, data: {message: err.message}}); 
    }); 
}); 

これは、コンソールログが私を示したものです:

Signup 0 
-------------------------- 
ModelBase { 
    attributes: 
    { id: 2, 
    usermeta_id: 5, 
    state: 'pending', 
    created_at: Thu May 05 2016 17:21:13 GMT+0200 (Romance Daylight Time), 
    updated_at: Thu May 05 2016 17:21:13 GMT+0200 (Romance Daylight Time) }, 
    _previousAttributes: 
    { id: 2, 
    usermeta_id: 5, 
    state: 'pending', 
    created_at: Thu May 05 2016 17:21:13 GMT+0200 (Romance Daylight Time), 
    updated_at: Thu May 05 2016 17:21:13 GMT+0200 (Romance Daylight Time) }, 
    changed: {}, 
    relations: 
    { usermeta: 
     ModelBase { 
     attributes: {}, 
     _previousAttributes: {}, 
     changed: {}, 
     relations: {}, 
     cid: 'c38', 
     relatedData: [Object] } }, 
    cid: 'c35', 
    id: 2 } 
Related usermeta 
-------------------------- 
ModelBase { 
    attributes: {}, 
    _previousAttributes: {}, 
    changed: {}, 
    relations: {}, 
    cid: 'c38', 
    relatedData: 
    RelationBase { 
    targetTableName: 'tblUsersMeta', 
    targetIdAttribute: 'id', 
    type: 'belongsTo', 
    target: 
     { [Function] 
     NotFoundError: [Function: ErrorCtor], 
     NoRowsUpdatedError: [Function: ErrorCtor], 
     NoRowsDeletedError: [Function: ErrorCtor] }, 
    foreignKey: 'tblUsersMetum_id', 
    parentId: undefined, 
    parentTableName: 'tblSignups', 
    parentIdAttribute: 'id', 
    parentFk: undefined } } 

関連するモデル属性が空であることがわかります。次のように私は私のusermetaを救っ:(サインアップ・テーブル内の)usermetaのIDが正しく設定されているデータベース内

userMeta.save().then(function(usermeta) { 
     var signup = new model.SignUp({ 
      usermeta_id: usermeta.attributes.id 
     }); 
     signup.save().then(function() { 
      req.flash('success', 'Success!'); 
      res.redirect('/signup'); 
     }).catch(function(err) { 
      res.status(500).json({error: true, data: {message: err.message}}); 
     }); 
     }).catch(function (err) { 
     res.status(500).json({error: true, data: {message: err.message}}); 
     }); 

。私はここで間違って何をしていますか?

答えて

1

あなたのモデルに何か問題があるようです。両方の例でbelongsToを使用するモデル間の関係を設定するときには、それは正しいものではありません。私はそれらの関係が何であるか分かりません(多対多、一対多)。多対多の場合はbelongsToManyを使用する必要があり、1対多数の場合は、データベースに外部キーを保持しないモデルにhasManyを設定し、外部キーを持つモデルにbelongsToを設定する必要がありますデータベース。

はこのhttp://bookshelfjs.org/#one-to-manyと、このことができます。このhttp://bookshelfjs.org/#many-to-many

希望を参照してください!

+0

これは1対1の関係でしたが、実際には "hasOne"であったはずです。ありがとうございました! – Goowik

関連する問題