2014-02-22 48 views
0

我真的很喜欢Sequelize,但有些东西我似乎无法包住我的头,并得到适当的设置。我了解数据库模式以及如何编写SQL,但是关于这种ORM有些东西我只是不明白什么时候涉及到这种类型的关系。一对一的关系,并建立联系

我的模型中的两个对象/表格需要一对一关系以及一对多关系。这是我会怎么形容呢...

用户

  • 有很多媒体
  • 有一个媒体称PrimaryMedia(应在用户表作为PrimaryMediaId创建FK(应在媒体表作为用户ID创建FK) )

我读过的文件几次,为了得到表创建正确的方式,但当时我不明白,从我的对象,以期望在制定者而言有什么尝试过不同的排列/干将。 IE,对于上面的例子中我会期望......

用户

  • 有方法addMedia,removeMedia和setMedia
  • 有方法setPrimaryMedia

什么是对的正确方法设置这两个模型对象?

编辑:我已经成功地得到了一个到一个完全工作,但一到多没有更新外键...

user.js的

... 
User.hasMany(models.Media, { 
    as: 'Media', 
    foreignKeyConstraint: true 
}), 
User.hasOne(models.Media, { 
    as: 'PrimaryMedia' 
}), 
User.belongsTo(models.Media, { 
    as: 'PrimaryMedia', 
    foreignKey: 'PrimaryMediaId' 
}) 
... 

Media.js

... 
Media.hasOne(models.User, { 
    as: 'User', 
    foreignKey: 'PrimaryMediaId' 
}), 
... 

在行动......

Media.create({ 
    type: 'image', 
    nativeURL: nativeURL, 
    mediumURL: mediumURL, 
    smallURL: smallURL 
}).success(function(newMedia) { 
    _user.addMedium(newMedia).success(function(){ // THIS ISN'T WORKING (Media.UserId column always null) 
     console.log('media user set'); 
    }); 
    _user.setPrimaryMedia(newMedia).success(function(){ // THIS IS WORKING 
     console.log('user primary media set'); 
    }); 
    success(newMedia); 
}).error(function(err) { 
    error(err); 
}); 

回答

0

也许添加属性 '主要' 到媒体,和使用:

user.addMedium(newMedia, { primary: true }); 

我运行你的代码,它的工作:

var sequelize = new Sequelize('schema', 'user', 'password', {host: 'localhost'}); 

User = sequelize.define('User', {name: Sequelize.STRING}); 

Media = sequelize.define('Media', {title: Sequelize.STRING}); 

User.hasMany(Media, { 
    as: 'Media', 
    foreignKeyConstraint: true 
}), 

User.hasOne(Media, { 
    as: 'PrimaryMedia' 
}), 

User.belongsTo(Media, { 
    as: 'PrimaryMedia', 
    foreignKey: 'PrimaryMediaId' 
}); 

sequelize.sync().success(function(){ 

    User.create().success(function(_user){ 

     Media.create({}).success(function(newMedia) { 

      _user.addMedium(newMedia).success(function(){ // THIS ISN'T WORKING (Media.UserId column always null) 
       console.log('media user set'); 
      }).error(function(error){ 
       console.log('cant add media', error); 
      }); 

      _user.setPrimaryMedia(newMedia).success(function(){ // THIS IS WORKING 
       console.log('user primary media set'); 
      }).error(function(error){ 
       console.log('cant set primaryMedia', error); 
      }); 

     }).error(function(err) { 
      error(err); 
     }); 

    }).error(function(error){ 
     console.log('user create', error) 
    }) 

}).error(function(error){ 
    console.log('sync error', error); 
}); 

日志:

INSERT INTO `Users` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'2014-02-24 13:01:57','2014-02-24 13:01:57'); 
INSERT INTO `Media` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'2014-02-24 13:01:57','2014-02-24 13:01:57'); 
SELECT * FROM `Media` WHERE `UserId` = 1 AND `Media`.`id` = 1; 
UPDATE `Users` SET `PrimaryMediaId`=1,`updatedAt`='2014-02-24 13:01:57' WHERE `id`=1 
user primary media set 
UPDATE `Media` SET `id`=1,`createdAt`='2014-02-24 13:01:57',`updatedAt`='2014-02-24 13:01:57',`UserId`=1 WHERE `id`=1 
media user set 
+0

我已经找到了问题来自开发人员的帮助。部分原因是缺乏belongsTo(),但主要是因为在稍后再次输入模型会跺脚关系。我附加了模型来续集并且工作。 –