2016-05-06 6 views
0

У меня, похоже, проблема с извлечением атрибутов из родственной модели.Книжная полка с атрибутами связанных данных пуста

Модели:

// 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.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}}); 
     }); 

В базе данных идентификатор usermeta (в таблице SIGNUP) установлен правильно. Что я здесь делаю неправильно?

ответ

1

Похоже, что что-то не так с вашими моделями. Когда вы настраиваете связь между моделями, вы используете belongsTo в обоих примерах - это не может быть правильно. Я не знаю, какова связь между ними (многие-ко-многим? Один-ко-многим?). Если это много-ко многим, вам нужно использовать belongsToMany, и если это один-ко-многим, вам нужно установить hasMany на модель, которая не содержит внешний ключ в базе данных и belongsTo модели, которая имеет внешний ключ в база данных.

Смотрите это http://bookshelfjs.org/#one-to-many и это http://bookshelfjs.org/#many-to-many

Надеется, что это помогает!

+0

Это было отношение «один к одному», но на самом деле это должно было быть «hasOne». Спасибо! – Goowik