一对一关系与建立联系

电子商务

到目前为止,我真的很喜欢Sequelize,但是有些事情似乎我无法绕开并正确设置。我了解数据库模式以及如何编写SQL,但是关于这种类型的关系,我只是不了解这个ORM。

我的模型中的两个对象/表需要一对一的关系以及一对多的关系。这就是我的描述方式...

用户

  • 有许多媒体(应在媒体表上创建FK作为UserId)
  • 有一个名为PrimaryMedia的媒体(应该在User表上创建FK作为PrimaryMediaId)

我已经阅读了几次文档,并尝试了不同的排列方式,以使表以正确的方式创建,但随后我不明白在设置器/获取器方面期望从对象中得到什么。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);
});
谢尔盖·卡拉舍夫(Sergey Karasev)

也许将属性“主要”添加到媒体,并用作:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

建立一对一关系

来自分类Dev

无法与Sequelize建立一对一关系

来自分类Dev

模式中建立一对一关系的方法?

来自分类Dev

无法在实体之间建立一对一关系

来自分类Dev

插入一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系插入

来自分类Dev

休眠一对一关系

来自分类Dev

GSON一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系

来自分类Dev

MYSQL一对一关系

来自分类Dev

实现一对一关系

来自分类Dev

与查询的一对一关系

来自分类Dev

Laravel 5:建立一对一关系时的鸡肉和鸡蛋

来自分类Dev

学说–如何在两个实体之间建立一对一关系

来自分类Dev

实体框架代码首先在复杂实体之间建立一对一关系

来自分类Dev

如何使用“数据库优先”建立一对一关系?

来自分类Dev

Laravel Seeding 使用 Factory 建立一对一关系

来自分类Dev

与 EF 中的许多表建立一对一关系

来自分类Dev

定义了 2 个模型之间的一对一关系,但似乎仍然能够建立一对多

来自分类Dev

与同一模型的雄辩一对一关系

来自分类Dev

休眠一对一关系错误

来自分类Dev

SQL一对一关系与单个表

来自分类Dev

亲子一对一关系表

来自分类Dev

Symfony2一对一关系表

来自分类Dev

laravel一对一关系:交换方法

来自分类Dev

在Swift中以一对一关系插入NSManagedObject