Goowik
Goowik

Reputation: 803

Bookshelf get related data attributes is empty

I seem to have an issue with retrieving attributes from a related model.

Models:

// 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;

Admin Signup route:

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

This is what the console log shows me:

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 } }

So as you can see the related model attributes is empty. I saved my usermeta as follows:

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

Within the database the usermeta's id (in the signup table) is set correctly. What am I doing wrong here?

Upvotes: 0

Views: 848

Answers (1)

uglycode
uglycode

Reputation: 3082

It appears that something is wrong with your models. When you're setting up the relation between the models you use belongsTo in both examples - that can't be right. I don't know what is the relation between them (many-to-many? one-to-many?). If it's many-to-many you need to use belongsToMany and if it's one-to-many you need to set hasMany on the model that does not hold the foreign key in the database and belongsTo to the model that has the foreign key in the database.

See this http://bookshelfjs.org/#one-to-many and this http://bookshelfjs.org/#many-to-many

Hope this helps!

Upvotes: 1

Related Questions